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