【android开发-24】android中访问http协议网络以及解析xml格式数据的详细讲解
1,访问http协议网络
在Android中,使用HttpURLConnection访问网络的完整参考代码如下:
首先,创建一个名为HttpUtils的工具类,用于封装HTTP请求的方法。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class HttpUtils {
public static String sendHttpGetRequest(String url) throws IOException {
URL obj = new URL(url);
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
// 设置请求方法为GET
con.setRequestMethod("GET");
// 添加请求头
con.setRequestProperty("User-Agent", "Mozilla/5.0");
int responseCode = con.getResponseCode();
System.out.println("Response Code: " + responseCode);
InputStream inputStream = null;
BufferedReader reader = null;
StringBuilder result = new StringBuilder();
try {
inputStream = con.getInputStream();
reader = new BufferedReader(new InputStreamReader(inputStream));
String line;
while ((line = reader.readLine()) != null) {
result.append(line);
}
} finally {
if (reader != null) {
reader.close();
}
if (inputStream != null) {
inputStream.close();
}
con.disconnect();
}
return result.toString();
}
}
在需要发送HTTP请求的地方,调用HttpUtils类中的sendHttpGetRequest方法。
import android.os.AsyncTask;
import android.util.Log;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.textView);
new HttpRequestTask().execute("https://api.example.com/data");
}
private class HttpRequestTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
String result = "";
try {
result = HttpUtils.sendHttpGetRequest(params[0]);
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
textView.setText(result);
}
}
}
在这个示例中,我们创建了一个名为HttpUtils的工具类,其中包含一个名为sendHttpGetRequest的方法,用于发送HTTP GET请求。然后,在MainActivity中,我们创建了一个名为HttpRequestTask的内部类,继承自AsyncTask,并在doInBackground方法中调用HttpUtils.sendHttpGetRequest方法。最后,在onPostExecute方法中,我们将获取到的数据显示在TextView中。
在Android中,访问网络需要声明权限。首先需要在AndroidManifest.xml文件中添加以下权限:
<uses-permission android:name="android.permission.INTERNET" />
2,使用Pull方式解析XML格式数据
在Android中,使用Pull方式解析HTTP URLConnection返回的XML格式数据的代码示例如下:
首先,创建一个名为HttpUtils的工具类,用于处理HTTP请求和响应:
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class HttpUtils {
public static String getResponse(String requestUrl) throws Exception {
URL url = new URL(requestUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setConnectTimeout(5000);
connection.setReadTimeout(5000);
int responseCode = connection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
InputStream inputStream = connection.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder stringBuilder = new StringBuilder();
String line;
while ((line = bufferedReader.readLine()) != null) {
stringBuilder.append(line);
}
bufferedReader.close();
return stringBuilder.toString();
} else {
throw new Exception("请求失败,响应码:" + responseCode);
}
}
}
然后,在需要解析XML数据的地方,调用HttpUtils.getResponse()方法获取XML字符串,并使用Android内置的XmlPullParser进行解析:
import android.util.Xml;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
import java.io.IOException;
import java.io.StringReader;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
String xmlString = HttpUtils.getResponse("http://example.com/data.xml");
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
XmlPullParser xpp = factory.newPullParser();
xpp.setInput(new StringReader(xmlString));
int eventType = xpp.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
if (eventType == XmlPullParser.START_TAG) {
String tagName = xpp.getName();
switch (tagName) {
case "item":
// 处理item标签的数据
break;
case "name":
// 处理name标签的数据
break;
case "value":
// 处理value标签的数据
break;
}
}
eventType = xpp.next();
}
} catch (IOException | XmlPullParserException e) {
e.printStackTrace();
}
}
}
注意:请将http://example.com/data.xml替换为实际的XML数据地址。
3,使用OKHttp访问网络
在Android中,使用OkHttp访问网络的完整参考代码例子如下:
首先,在项目的build.gradle文件中添加OkHttp依赖:
dependencies {
implementation 'com.squareup.okhttp3:okhttp:4.9.0'
}
然后,创建一个名为OkHttpUtil的工具类,用于封装OkHttp相关的操作:
import okhttp3.*;
import java.io.IOException;
public class OkHttpUtil {
private static final OkHttpClient client = new OkHttpClient();
public static String get(String url) throws IOException {
Request request = new Request.Builder()
.url(url)
.build();
try (Response response = client.newCall(request).execute()) {
return response.body().string();
}
}
}
最后,在需要使用OkHttp的地方调用OkHttpUtil工具类的方法:
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import java.io.IOException;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textView = findViewById(R.id.textView);
try {
String result = OkHttpUtil.get("https://api.github.com/users/octocat");
textView.setText(result);
} catch (IOException e) {
e.printStackTrace();
}
}
}
这个例子展示了如何使用OkHttp库发送GET请求并获取响应。你可以根据需要修改OkHttpUtil类中的方法和参数来实现其他HTTP方法(如POST、PUT、DELETE等)。
4,使用SAX方式解析xml格式数据
在Android中使用SAX解析XML格式数据,首先需要创建一个继承自DefaultHandler的类,然后重写其中的方法来处理XML元素和属性。接下来,使用SAXParserFactory创建一个SAXParser对象,并调用其parse`方法来解析XML数据。
以下是一个简单的示例:
创建一个继承自DefaultHandler的类,例如MyHandler:
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class MyHandler extends DefaultHandler {
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
// 在这里处理XML元素的开始标签
System.out.println("开始标签:" + qName);
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
// 在这里处理XML元素的结束标签
System.out.println("结束标签:" + qName);
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
// 在这里处理XML元素的文本内容
System.out.println("文本内容:" + new String(ch, start, length));
}
}
使用SAXParserFactory和SAXParser解析XML数据:
import android.os.AsyncTask;
import android.util.Log;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new FetchXmlTask().execute("https://api.github.com/users/octocat");
}
private class FetchXmlTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... urls) {
try {
URL url = new URL(urls[0]);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.connect();
if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
InputStream inputStream = connection.getInputStream();
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
MyHandler handler = new MyHandler();
saxParser.parse(inputStream, handler);
return null;
} else {
return null;
}
} catch (IOException | ParserConfigurationException | SAXException e) {
e.printStackTrace();
return null;
}
}
}
}
这个示例中,我们创建了一个名为MyHandler的类来处理XML元素和属性,然后在MainActivity中使用FetchXmlTask异步任务来获取OKHttp返回的XML数据,并使用SAX解析器解析这些数据。
5,发送数据给网络服务器
在Android中,可以使用HttpURLConnection或者第三方库如OkHttp来发送数据给网络服务器。这里给出一个使用HttpURLConnection的简单示例:
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Thread(new Runnable() {
@Override
public void run() {
try {
String url = "https://api.example.com/data";
URL obj = new URL(url);
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
// 设置请求方法为POST
con.setRequestMethod("POST");
// 添加请求头
con.setRequestProperty("User-Agent", "Mozilla/5.0");
con.setRequestProperty("Content-Type", "application/json");
// 发送POST请求必须设置如下两行
con.setDoOutput(true);
con.setDoInput(true);
// 获取连接对象对应的输出流
DataOutputStream wr = new DataOutputStream(con.getOutputStream());
wr.writeBytes("{\"key\":\"value\"}");
wr.flush();
wr.close();
int responseCode = con.getResponseCode();
System.out.println("Response Code: " + responseCode);
BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
// 输出结果
System.out.println(response.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
}
这个示例中,我们创建了一个新的线程来执行网络请求,以避免阻塞主线程。我们使用HttpURLConnection发起一个POST请求,并添加了一个请求头。然后,我们将要发送的数据写入输出流,并获取服务器的响应。最后,我们将响应内容输出到控制台。
注意:提交的数据都要以键值对的形式存在,数据与数据间用&符合隔开。比如wr.writeBytes(“username=admin&password=123456”);
5,使用Gson方式解析json格式的数据
在Android中使用Gson库解析OKHttp网络返回的数据,首先需要添加Gson库的依赖。在项目的build.gradle文件中添加以下依赖:
dependencies {
implementation 'com.google.code.gson:gson:2.8.9'
}
然后,创建一个Java类来表示网络返回的数据结构。例如,假设网络返回的数据是一个包含用户信息的JSON对象:
{
"name": "张三",
"age": 30
}
可以创建一个名为User的Java类:
public class User {
private String name;
private int age;
// getter和setter方法
}
接下来,使用Gson库将网络返回的JSON字符串解析为User对象:
import com.google.gson.Gson;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 假设这是从OKHttp网络请求中获取到的JSON字符串
String json = "{\"name\":\"张三\",\"age\":30}";
// 创建Gson对象
Gson gson = new Gson();
// 使用Gson对象将JSON字符串解析为User对象
User user = gson.fromJson(json, User.class);
// 输出解析后的用户信息
System.out.println("姓名:" + user.getName() + ",年龄:" + user.getAge());
}
}
这样,就可以使用Gson库将OKHttp网络返回的数据解析为Java对象了。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!