Bootstrap

Android 网络请求(一)初识HTTP网络通信

学习笔记

代码样例

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class HttpURLConnectionExample {

     public String getDataFromServer() {
        String result = ""; // 存储请求返回的响应数据
        HttpURLConnection urlConnection = null; // 用于处理 HTTP 连接
        BufferedReader reader = null; // 用于读取响应数据
        try {
            // 创建 URL 对象,传入目标 URL 地址
            URL url = new URL("https://jsonplaceholder.typicode.com/posts");
            // 打开 HTTP 连接
            urlConnection = (HttpURLConnection) url.openConnection();
            // 设置请求方法为 GET
            urlConnection.setRequestMethod("GET");
            // 设置请求头(可选,取决于服务器的需求)
            urlConnection.setRequestProperty("Content-Type", "application/json");
            // 设置连接超时和读取超时,防止请求卡住
            urlConnection.setConnectTimeout(5000); // 设置连接超时 5 秒
            urlConnection.setReadTimeout(5000);    // 设置读取超时 5 秒
            // 获取响应码,检查是否请求成功
            int responseCode = urlConnection.getResponseCode();
            if (responseCode == HttpURLConnection.HTTP_OK) { // 200 表示请求成功
                // 创建输入流读取服务器响应的数据
                reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
                String line;
                StringBuilder response = new StringBuilder(); // 用 StringBuilder 存储响应内容
                // 按行读取响应数据
                while ((line = reader.readLine()) != null) {
                    response.append(line);
                }
                // 将响应数据存储在 result 变量中
                result = response.toString();
            } else {
                // 请求失败,返回错误信息
                result = "Request failed with response code: " + responseCode;
            }
        } catch (Exception e) {
            // 捕获异常并打印堆栈信息
            e.printStackTrace();
            result = "Error: " + e.getMessage();
        } finally {
            // 关闭输入流和连接
            try {
                if (reader != null) {
                    reader.close();
                }
                if (urlConnection != null) {
                    urlConnection.disconnect();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        // 返回响应数据或错误信息
        return result;
    }
}

代码解释:

 1. 创建 HttpURLConnection 连接

URL url = new URL("https://jsonplaceholder.typicode.com/posts");
urlConnection = (HttpURLConnection) url.openConnection();
  • 使用 new URL() 创建 URL 对象。

  • 使用 openConnection() 方法打开一个连接。返回值是 HttpURLConnection 类型,我们可以通过这个对象设置请求方法和头信息等。

2. 设置请求方法和请求头

urlConnection.setRequestMethod("GET");
urlConnection.setRequestProperty("Content-Type", "application/json");
  • setRequestMethod("GET"):设置请求方式为 GET,这表示从服务器获取数据。

  • setRequestProperty("Content-Type", "application/json"):设置请求头,指定请求的内容类型为 JSON。根据服务器的要求,这一步可选。

3. 设置超时

urlConnection.setConnectTimeout(5000); // 设置连接超时 5 秒
urlConnection.setReadTimeout(5000);    // 设置读取超时 5 秒
  • setConnectTimeout(5000):设置连接超时为 5 秒。如果超过这个时间仍无法连接,则会抛出 SocketTimeoutException

  • setReadTimeout(5000):设置读取超时为 5 秒。如果在这个时间内没有从服务器读取到数据,也会抛出 SocketTimeoutException

4. 获取响应码并读取响应数据

int responseCode = urlConnection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
    // 请求成功,读取数据
    reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
    String line;
    StringBuilder response = new StringBuilder();
    while ((line = reader.readLine()) != null) {
        response.append(line);
    }
    result = response.toString();
} else {
    // 请求失败
    result = "Request failed with response code: " + responseCode;
}
  • getResponseCode() 获取服务器返回的 HTTP 状态码。如果返回 200(HTTP_OK),表示请求成功。

  • 通过 urlConnection.getInputStream() 获取响应的输入流,读取服务器返回的数据。

  • 使用 BufferedReader 按行读取响应内容,并使用 StringBuilder 将其拼接成一个完整的字符串。

5. 关闭流和连接

if (reader != null) {
    reader.close();
}
if (urlConnection != null) {
    urlConnection.disconnect();
}
  • finally 块中关闭 BufferedReaderHttpURLConnection,以确保资源被释放,避免内存泄漏。

6. 异常处理

catch (Exception e) {
    e.printStackTrace();
    result = "Error: " + e.getMessage();
}
  • 捕获异常,并输出错误信息。
  • 返回错误消息。

异步请求

在 Android 开发中,不能在主线程执行网络请求,因为这会导致 ANR(应用无响应)错误。所以需要在子线程中执行网络请求。

new Thread(new Runnable() {
    @Override
    public void run() {
        String result = getDataFromServer(); // 调用上面的方法进行网络请求
        // 在此处处理返回的数据
    }
}).start();

总结

  • HttpURLConnection 是 Java 提供的低级别 HTTP 客户端,用于发送 HTTP 请求并接收响应。

  • 通过 setRequestMethod() 设置请求类型,getResponseCode() 获取响应状态码,getInputStream() 获取响应数据。

  • 必须在子线程中执行网络请求,避免阻塞主线程。

  • 需要手动管理超时设置、请求头、连接关闭等。

尽管 HttpURLConnection 是 Android 内置的网络库,但它相对较为底层,开发者需要手动处理一些细节。如果需要更高级的功能,建议使用 OkHttpRetrofit 等库,这些库提供了更简洁的 API 和更强的功能

;