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

Java HTTP 請求工具類:GET/POST 完整實作與連線池優化建議

     編輯:Java 相關知識

基於 HttpURLConnection 的通用請求封裝

標準 JDK HttpURLConnection 實作無依賴 HTTP 客戶端,支援 GET/POST、Header 設定、超時控制、編碼處理、資源自動釋放。

核心工具類 HttpRequest

import java.io.*;
import java.net.*;
import java.util.*;

public class HttpRequest {

    /** 發送 GET 請求 */
    public static String sendGet(String url, String param) {
        StringBuilder result = new StringBuilder();
        BufferedReader in = null;
        try {
            String urlStr = url + (param.isEmpty() ? "" : "?" + param);
            URL realUrl = new URL(urlStr);
            URLConnection conn = realUrl.openConnection();
            
            // 通用請求頭
            conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "Keep-Alive");
            conn.setRequestProperty("user-agent", 
                "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
            
            conn.connect();
            
            in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
            String line;
            while ((line = in.readLine()) != null) result.append(line);
        } catch (Exception e) {
            System.err.println("GET 請求異常: " + e);
            e.printStackTrace();
        } finally {
            closeQuietly(in);
        }
        return result.toString();
    }

    /** 發送 POST 請求 */
    public static String sendPost(String url, String param) {
        PrintWriter out = null;
        BufferedReader in = null;
        StringBuilder result = new StringBuilder();
        try {
            URL realUrl = new URL(url);
            URLConnection conn = realUrl.openConnection();
            
            conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "Keep-Alive");
            conn.setRequestProperty("user-agent", 
                "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
            
            // POST 必須設定
            conn.setDoOutput(true);
            conn.setDoInput(true);
            
            out = new PrintWriter(conn.getOutputStream());
            out.print(param);
            out.flush();
            
            in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
            String line;
            while ((line = in.readLine()) != null) result.append(line);
        } catch (Exception e) {
            System.err.println("POST 請求異常: " + e);
            e.printStackTrace();
        } finally {
            closeQuietly(out);
            closeQuietly(in);
        }
        return result.toString();
    }

    private static void closeQuietly(Closeable c) {
        if (c != null) try { c.close(); } catch (IOException ignored) {}
    }
}

使用範例

// GET
String getResp = HttpRequest.sendGet("https://api.example.com/users", "id=123&name=test");

// POST (application/x-www-form-urlencoded)
String postResp = HttpRequest.sendPost("https://api.example.com/login", "username=admin&password=123456");

// POST JSON (需額外設定 Content-Type)
/*
HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
conn.setDoOutput(true);
try (OutputStream os = conn.getOutputStream()) {
    os.write(jsonString.getBytes("UTF-8"));
}
*/

關鍵細節解析

  1. 編碼指定:InputStreamReader(conn.getInputStream(), "UTF-8") 避免中文亂碼。
  2. 連線/讀取超時:原代碼未設定,生產環境**必須**加上:
    conn.setConnectTimeout(5000); // 連線 5 秒
    conn.setReadTimeout(10000);   // 讀取 10 秒
  3. Keep-Alive:connection: Keep-Alive 復用 TCP 連線,降低延遲。
  4. 資源釋放:finally 區塊確保流關閉,JDK 7+ 建議 try-with-resources。

生產環境強烈建議:遷移至成熟 HTTP 客戶端

客戶端特點Maven 依賴
Apache HttpClient 4.5+功能最完整、連線池、重試、攔截器、異步支援org.apache.httpcomponents:httpclient
OkHttp 3/4現代化、HTTP/2、連線池、Kotlin 友善、Android 首選com.squareup.okhttp3:okhttp
Java 11+ HttpClient標準庫、HTTP/2、WebSocket、CompletableFuture 異步無 (java.net.http)

HttpClient 4.5 連線池範例

CloseableHttpClient httpClient = HttpClients.custom()
    .setMaxConnTotal(200)
    .setMaxConnPerRoute(50)
    .evictIdleConnections(30, TimeUnit.SECONDS)
    .build();

HttpGet get = new HttpGet("https://api.example.com/users?id=123");
try (CloseableHttpResponse resp = httpClient.execute(get)) {
    String body = EntityUtils.toString(resp.getEntity(), "UTF-8");
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved