学习笔记
代码样例
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
块中关闭BufferedReader
和HttpURLConnection
,以确保资源被释放,避免内存泄漏。
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 内置的网络库,但它相对较为底层,开发者需要手动处理一些细节。如果需要更高级的功能,建议使用 OkHttp 或 Retrofit 等库,这些库提供了更简洁的 API 和更强的功能