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

学习笔记

代码样例

java 复制代码
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 连接

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

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

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

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

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

3. 设置超时

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

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

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

java 复制代码
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. 关闭流和连接

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

6. 异常处理

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

异步请求

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

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

总结

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

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

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

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

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

相关推荐
catoop11 分钟前
Android 最佳实践、分层架构与全流程解析(2025)
android
向宇it33 分钟前
关闭SSH密码登录,SSH 如何使用公钥密钥登录服务器(解决服务器经常被攻击问题)
服务器·网络·ssh
ZHANG13HAO40 分钟前
Android 13 特权应用(Android Studio 开发)调用 AOSP 隐藏 API 完整教程
android·ide·android studio
哼?~1 小时前
Socket--TCP
网络
@insist1231 小时前
网络工程师-网络设备基本配置篇:从登录设备到基础管理
网络·网络工程师·软考·软件水平考试
田梓燊1 小时前
leetcode 142
android·java·leetcode
angerdream1 小时前
Android手把手编写儿童手机远程监控App之JAVA基础
android
不会写DN2 小时前
处理 TCP 流中的消息分片
服务器·网络·tcp/ip
菠萝地亚狂想曲2 小时前
Zephyr_01, environment
android·java·javascript
深蓝海拓2 小时前
基于QtPy (PySide6) 的PLC-HMI工程项目(八)在上位机中解析上行报文
网络·笔记·python·学习·plc