悠悠楠杉
网站页面
正文:
在Java开发中,发送HTTP请求是常见的需求,无论是调用第三方API还是实现服务间通信。HttpURLConnection作为Java标准库中的核心类,提供了轻量级的HTTP客户端功能。本文将带你从零开始掌握其使用技巧。
HttpURLConnection是java.net包中的类,基于HTTP协议实现客户端功能。与第三方库(如Apache HttpClient)相比,它无需额外依赖,适合简单场景。
发送请求的第一步是建立连接:
URL url = new URL("https://api.example.com/data");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();注意:
- 需处理MalformedURLException和IOException;
- 默认使用GET方法,需显式设置其他方法。
GET请求适用于数据查询。以下是完整示例:
try {
URL url = new URL("https://api.example.com/data?param1=value1");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
// 设置请求头
conn.setRequestProperty("User-Agent", "Java/1.8");
// 获取响应码
int responseCode = conn.getResponseCode();
if (responseCode == 200) {
// 读取响应数据
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String inputLine;
StringBuilder response = new StringBuilder();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
}
} catch (Exception e) {
e.printStackTrace();
}关键点:
- setRequestProperty()添加请求头;
- getInputStream()读取响应流时需关闭资源。
POST请求常用于提交数据。需额外设置输出流和请求体:
try {
URL url = new URL("https://api.example.com/submit");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setDoOutput(true); // 允许写入请求体
// 设置请求头和请求体
conn.setRequestProperty("Content-Type", "application/json");
String requestBody = "{\"name\":\"John\", \"age\":30}";
try (OutputStream os = conn.getOutputStream()) {
byte[] input = requestBody.getBytes("utf-8");
os.write(input, 0, input.length);
}
// 处理响应(同GET示例)
} catch (Exception e) {
e.printStackTrace();
}注意事项:
- setDoOutput(true)必须调用;
- 请求体格式需与服务端约定(如JSON/Form-Data)。
避免请求阻塞:
conn.setConnectTimeout(5000); // 连接超时5秒
conn.setReadTimeout(10000); // 读取超时10秒默认自动重定向,可手动关闭:
conn.setInstanceFollowRedirects(false);区分网络异常和业务异常:
try {
// 请求逻辑
} catch (SocketTimeoutException e) {
System.err.println("请求超时");
} catch (IOException e) {
System.err.println("网络错误: " + e.getMessage());
}Connection: keep-alive);conn.getHeaderFields()打印响应头;SSLContext)。