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

embedded/2024/11/24 11:39:28/

学习笔记

代码样例

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();// 设置请求方法为 GETurlConnection.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() {@Overridepublic void run() {String result = getDataFromServer(); // 调用上面的方法进行网络请求// 在此处处理返回的数据}
}).start();

总结

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

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

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

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

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


http://www.ppmy.cn/embedded/140115.html

相关文章

MAC借助终端上传jar包到云服务器

前提:保证工程本地已打包完成:图中路径即为项目的target目录下已准备好的jar包 第一步:打开终端(先不要连接自己的服务器),输入下面的上传命令: scp /path/to/local/app.jar username192.168.1…

node节点无法加入集群

node02节点在加入集群时提示 [preflight] Running pre-flight checkserror execution phase preflight: couldnt validate the identity of the API Server: failed to request the cluster-info ConfigMap: client rate limiter Wait returned an error: rate: Wait(n1) would…

什么是JavaScript原型链?

原型链(Prototype Chain)是JavaScript中面向对象编程的一个核心概念,它定义了对象之间的层次关系和属性查找机制。在JavaScript中,每个对象都有一个[[Prototype]]属性(内部属性),这个属性指向其…

java excel 导入各种踩坑

在 Java 中处理 Excel 导入时,常见的问题(即“踩坑”)很多,下面列举了处理 Excel 导入时可能遇到的一些问题,并给出了解决方案和优化技巧。 1. POI 库与版本问题 Apache POI 是处理 Excel 的常用库,但是不…

解决Excel文件流读取数字为时间乱码问题

在将Excel文件流转换为Java中的List时,如果遇到文本被错误地识别为日期格式的问题,这通常是由于Apache POI库在处理单元格数据时默认的行为所导致的。Apache POI会尝试根据单元格的内容自动确定其类型,包括字符串、数字(可能解释为…

安卓手机5G网络频繁掉4G 问题解决 手机5G网络优化方案

问题环境 在某个长期停留的位置(例如:躺平)使用手机时网络突然从5G跳到4G,偶尔跳来跳去导致网络体验很差,经过调整5G网络情况下网速及其他体验都要更好,基于这样的情况使用一种简单的操作,锁定5…

面向服务的软件工程——面向过程的系统分析:流程挖掘(week10)

文章目录 一、前言二、重点概念面向过程的系统分析:流程挖掘流程挖掘概述流程挖掘与数据科学的关系流程挖掘中的关键问题关于流程挖掘的常见误解应用场景流程挖掘的总体概述流程挖掘的三个技术场景流程挖掘的起点:日志数据流程挖掘中的一些符号日志条目示例事件日志的通用结构…

JMeter监听器与压测监控之Grafana

Grafana 是一个开源的度量分析和可视化套件,通常用于监控和观察系统和应用的性能。本文将指导你如何在 Kali Linux 上使用 Docker 来部署 Grafana 性能监控平台。 前提条件 Kali Linux:确保你已经安装了 Kali Linux。Docker:确保你的系统已…