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 和更强的功能

相关推荐
冬奇Lab6 小时前
MediaCodec 编解码基础:Buffer 队列、状态机与零拷贝的艺术
android·音视频开发·源码阅读
wanhengidc6 小时前
云手机对小说工作室的作用
运维·服务器·网络·网络协议·智能手机
盟接之桥7 小时前
盟接之桥®说制造:从“制造”到“智造”,以品类品牌重塑制造业的生态未来
大数据·网络·人工智能·学习·制造
志栋智能7 小时前
超自动化巡检:洞察未知隐患,助您事前不出事
大数据·运维·网络·数据库·自动化
做萤石二次开发的哈哈7 小时前
萤石开放平台音视频 P2P 能力核心是什么?
网络·网络协议·p2p
光影少年7 小时前
Android和iOS原生开发的基础知识对RN开发的重要性,RN打包发布时原生端需要做哪些配置?
android·前端·react native·react.js·ios
Fᴏʀ ʏ꯭ᴏ꯭ᴜ꯭.7 小时前
MySQL主从复制实战配置详解,以及企业级相关优化说明
android·mysql·adb
simpleeeeee7 小时前
安卓开发者应该知道的 10 个安卓性能优化秘诀
android
ICT系统集成阿祥7 小时前
DDoS 清洗 完整工作流程
网络·ddos
云飞云共享云桌面7 小时前
8-10位研发3D(sw、ug、creo)画图如何共享一台工作站?
运维·服务器·网络·数据库·3d·电脑