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

Java 實作 URL 參數傳遞與獲取 GET/POST 請求完整路徑及參數詳解

     編輯:Java 相關知識

Java 中處理 URL 請求參數的核心技巧

在 Java Web 開發中,無論是發送 HTTP 請求還是在 Servlet 中接收參數,正確處理 URL 參數都是基礎且關鍵的技能。本文將系統講解如何使用原生 Java 代碼實現 GET/POST 請求發送,以及在 Servlet 容器中獲取完整的請求 URL 與參數列表。

一、使用 HttpURLConnection 發送 GET/POST 請求

Java 標準庫提供的 HttpURLConnection 是最基礎的 HTTP 客戶端工具,無需引入第三方依賴即可完成請求發送與響應讀取。

1.1 發送 GET 請求並攜帶參數

public static String sendGet(String url, String param) {
    StringBuilder result = new StringBuilder();
    try {
        // 拼接完整 URL:基礎路徑 + ? + 參數字符串
        String urlName = url + "?" + param;
        URL realUrl = new URL(urlName);
        URLConnection connection = realUrl.openConnection();
        
        // 建立連接
        connection.connect();
        
        // 讀取響應流
        try (BufferedReader in = new BufferedReader(
                new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8))) {
            String line;
            while ((line = in.readLine()) != null) {
                result.append(line);
            }
        }
    } catch (Exception e) {
        System.err.println("GET 請求異常:" + e.getMessage());
        e.printStackTrace();
    }
    return result.toString();
}

關鍵點說明:

  • 參數需預先按 key1=value1&key2=value2 格式編碼(建議使用 URLEncoder.encode 處理中文)
  • 讀取流時指定字符集避免亂碼
  • 使用 try-with-resources 自動關閉流

1.2 發送 POST 請求並發送表單數據

public static String sendPost(String url, String param) {
    StringBuilder result = new StringBuilder();
    try {
        URL realUrl = new URL(url);
        HttpURLConnection conn = (HttpURLConnection) realUrl.openConnection();
        
        // 必須設置輸入輸出
        conn.setDoOutput(true);
        conn.setDoInput(true);
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
        conn.setRequestProperty("Charset", "UTF-8");
        
        // 寫入請求體
        try (PrintWriter out = new PrintWriter(
                new OutputStreamWriter(conn.getOutputStream(), StandardCharsets.UTF_8))) {
            out.print(param);
            out.flush();
        }
        
        // 讀取響應
        try (BufferedReader in = new BufferedReader(
                new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8))) {
            String line;
            while ((line = in.readLine()) != null) {
                result.append(line);
            }
        }
    } catch (Exception e) {
        System.err.println("POST 請求異常:" + e.getMessage());
        e.printStackTrace();
    }
    return result.toString();
}

POST 請求注意事項:

  • 必須設置 setDoOutput(true) 才能寫入請求體
  • 設置正確的 Content-Type 模擬表單提交
  • 輸出流寫入後需 flush() 確保數據發送

二、Servlet 容器中獲取請求完整路徑與參數

在 Servlet 環境下,HttpServletRequest 提供了豐富的 API 來獲取請求信息,但 GET 與 POST 參數獲取方式略有不同。

2.1 核心 API 對比

需求GET 請求POST 請求通用方案
完整請求 URLgetRequestURL()getRequestURL()getRequestURL()
查詢字符串getQueryString()無(參數在請求體)需手動拼接
所有參數 MapgetParameterMap()getParameterMap()getParameterMap()

2.2 統一獲取完整請求信息的 Servlet 示例

@WebServlet("/param-demo")
public class RequestParamServlet extends HttpServlet {
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
            throws ServletException, IOException {
        printRequestInfo(req, "GET");
    }
    
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) 
            throws ServletException, IOException {
        printRequestInfo(req, "POST");
    }
    
    private void printRequestInfo(HttpServletRequest request, String method) 
            throws IOException {
        request.setCharacterEncoding("UTF-8");
        resp.setContentType("text/plain;charset=UTF-8");
        PrintWriter writer = resp.getWriter();
        
        // 1. 獲取完整 URL(不含參數)
        StringBuilder fullUrl = new StringBuilder(request.getRequestURL().toString());
        
        // 2. 獲取所有參數並拼接
        Map paramMap = request.getParameterMap();
        StringBuilder queryString = new StringBuilder();
        for (Map.Entry entry : paramMap.entrySet()) {
            String key = entry.getKey();
            for (String value : entry.getValue()) {
                queryString.append(key).append('=').append(value).append('&');
            }
        }
        // 移除末尾 &
        if (queryString.length() > 0) {
            queryString.setLength(queryString.length() - 1);
        }
        
        // 3. 輸出結果
        writer.println(method + " 請求完整路徑: " + fullUrl);
        writer.println(method + " 請求參數列表: " + queryString);
        
        // 4. 如果是 GET,還可直接獲取原始查詢字符串
        if ("GET".equals(method)) {
            writer.println("原始 QueryString: " + request.getQueryString());
        }
    }
}

三、最佳實踐與常見坑點

  1. 編碼一致性:客戶端發送、服務端接收、數據庫存儲全鏈路統一使用 UTF-8
  2. 參數編碼:發送請求時對參數值進行 URLEncoder.encode(value, "UTF-8")
  3. 流關閉:務必在 finally 塊或 try-with-resources 中關閉輸入輸出流
  4. 大數據量:POST 請求無長度限制,適合文件上傳或大量數據傳輸
  5. 安全性:敏感信息(密碼、Token)必須走 POST 並使用 HTTPS

四、現代替代方案

雖然原生 API 學習價值高,但生產環境建議使用成熟的 HTTP 客戶端庫:

  • Apache HttpClient:功能豐富,連接池管理完善
  • OkHttp:Android 首選,支持 HTTP/2、連接復用
  • Spring RestTemplate / WebClient:Spring 生態項目首選,聲明式調用
  • JDK 11+ HttpClient:原生支持 HTTP/2、異步非阻塞,無第三方依賴

掌握底層原理有助於排查疑難雜症,實際開發中選擇合適的工具才能事半功倍。

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