【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对象了。

你可能感兴趣的:(android应用开发,网络,android,http)