当前位置:首页 > 后端开发 > 正文

Java如何发送HTTP请求?

Java访问网站可通过 HttpURLConnection或第三方库如Apache HttpClient、OkHttp实现,前者基于标准库发起HTTP请求,后者提供更简洁的API和高级功能,如连接池和异步处理。

Java提供了多种方式访问网站,无论是获取网页内容、调用API还是提交数据,以下是详细方法和代码示例:


核心方法及代码实现

HttpURLConnection(Java原生)

适合简单请求,无需第三方库:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class SimpleHttpClient {
    public static void main(String[] args) {
        try {
            // 1. 创建URL对象
            URL url = new URL("https://example.com/api/data");
            // 2. 打开连接并设置参数
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET"); // 支持GET/POST
            conn.setConnectTimeout(5000); // 超时时间(毫秒)
            // 3. 获取响应
            int status = conn.getResponseCode();
            if (status == 200) { // 成功响应
                BufferedReader reader = new BufferedReader(
                    new InputStreamReader(conn.getInputStream())
                );
                String line;
                StringBuilder response = new StringBuilder();
                while ((line = reader.readLine()) != null) {
                    response.append(line);
                }
                reader.close();
                System.out.println("响应内容: " + response.toString());
            } else {
                System.out.println("请求失败,状态码: " + status);
            }
            // 4. 关闭连接
            conn.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

关键点:

  • 设置请求头:conn.setRequestProperty("User-Agent", "Mozilla/5.0")(模拟浏览器)
  • POST请求:调用conn.setDoOutput(true),通过输出流发送数据。

Apache HttpClient(推荐)

适合复杂场景(连接池、重试机制等),需添加依赖:

Java如何发送HTTP请求?  第1张

<!-- Maven依赖 -->
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.13</version>
</dependency>

示例代码:

import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
public class AdvancedHttpClient {
    public static void main(String[] args) {
        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
            // 1. 创建GET请求
            HttpGet request = new HttpGet("https://example.com/api/data");
            // 2. 设置请求头
            request.addHeader("Accept", "application/json");
            // 3. 执行请求并处理响应
            try (CloseableHttpResponse response = httpClient.execute(request)) {
                String result = EntityUtils.toString(response.getEntity());
                System.out.println("响应内容: " + result);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

优势:

  • 自动管理连接池
  • 支持HTTPS、重定向、Cookie等
  • 更简洁的API

关键注意事项

  1. 异常处理

    • 捕获IOException处理网络故障
    • 检查HTTP状态码(如404、500)
  2. HTTPS支持

    • Java原生需配置证书:HttpsURLConnection + SSLContext
    • HttpClient自动处理(推荐)
  3. 资源释放

    • 关闭连接(conn.disconnect()
    • 使用try-with-resources自动释放资源(如HttpClient)
  4. 性能优化

    • 复用HttpClient实例(避免频繁创建)
    • 设置连接超时(setConnectTimeout)和读取超时(setReadTimeout

应用场景选择

场景 推荐方法
简单GET/POST请求 HttpURLConnection
高频请求、需要连接池 Apache HttpClient
异步请求 HttpClient + Future
现代REST API调用 Spring RestTemplate 或 WebClient

安全与合规

  1. 遵守Robots协议
    检查目标网站的robots.txt(如禁止爬取路径)。
  2. 设置合理请求频率
    避免高频请求导致IP被封(添加Thread.sleep())。
  3. 处理敏感数据
    使用HTTPS传输,避免明文传递密码。

引用说明:

  • Oracle官方HttpURLConnection文档
  • Apache HttpClient官方指南
  • 示例代码遵循MIT开源协议,可自由使用。

通过以上方法,您可安全高效地用Java访问网站,根据需求选择合适方案,并始终遵循目标网站的使用条款。

0