首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java 發送 HTTP 請求兩大方案:HttpClient 4.x 與 HttpURLConnection 對比

     編輯:Java 程式設計入門

方案一:Apache HttpClient 4.x(推薦企業級)

功能豐富:連線池、自動重試、攔截器、多執行緒安全、支援各種認證機制。

public static String sendUrlRequest(String urlStr, String param1, String param2) throws Exception {
    HttpClient httpClient = new DefaultHttpClient();
    // 連線池與超時配置
    httpClient.getParams().setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 20000);
    httpClient.getParams().setIntParameter(CoreConnectionPNames.SO_TIMEOUT, 20000);

    List<NameValuePair> nvps = new ArrayList<>();
    nvps.add(new BasicNameValuePair("mainMemoCode", param1));
    nvps.add(new BasicNameValuePair("recordPassWord", param2));

    HttpPost httpPost = new HttpPost(urlStr);
    httpPost.setEntity(new UrlEncodedFormEntity(nvps, "GBK")); // 編碼視伺服器而定

    HttpResponse response = httpClient.execute(httpPost);
    String contentType = response.getHeaders("Content-Type")[0].getValue();
    HttpEntity entity = response.getEntity();
    String result = EntityUtils.toString(entity);

    httpPost.abort();
    httpClient.getConnectionManager().shutdown();
    return result;
}

優勢總結

  • 連線管理:PoolingClientConnectionManager 可複用連線,高併發效能優異
  • 攔截器鏈:可統一加簽、日志、重試邏輯
  • 流式處理:HttpEntity 支援大檔案不佔記憶體

方案二:原生 HttpURLConnection(輕量場景)

public static String sendUrlRequest(String urlStr, String param) throws Exception {
    HttpURLConnection conn = null;
    try {
        URL url = new URL(urlStr);
        conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("POST");
        conn.setDoOutput(true);
        conn.setRequestProperty("User-Agent", "directclient");
        conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=GBK");

        try (PrintWriter out = new PrintWriter(new OutputStreamWriter(conn.getOutputStream(), "GBK"))) {
            out.println(param);
        }

        StringBuilder sb = new StringBuilder();
        try (BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "GBK"))) {
            String line;
            while ((line = in.readLine()) != null) sb.append(line);
        }
        return sb.toString();
    } finally {
        if (conn != null) conn.disconnect();
    }
}

適用場景

  • 簡單單次請求、無高併發、不想引入第三方 JAR
  • Android 早期版本(HttpClient 已移除)

深度對比表

維度HttpClient 4.xHttpURLConnection
依賴~500KB JAR零依賴
連線池內建無
API 複雜度中等較繁瑣
HTTPS 自簽憑證易配置需自定 TrustManager
多執行緒安全是每請求新建連線
維護狀態活躍(5.x 版本)JDK 內建持續更新

選型建議

  • 新專案 / 高併發 / 複雜業務:優先 Apache HttpClient 5.x 或 OkHttp
  • 舊專案維護 / 受限環境 / 簡單需求:HttpURLConnection 即可
  • Android:OkHttp 或 java.net.http.HttpClient (API 29+)

現代化替代:Java 11+ HttpClient

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create(urlStr))
    .header("Content-Type", "application/x-www-form-urlencoded")
    .POST(HttpRequest.BodyPublishers.ofString(params))
    .build();
String response = client.send(request, HttpResponse.BodyHandlers.ofString()).body();

標準化、支援 HTTP/2、非阻塞、函數式 API,長期來看為最佳選擇。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved