解決HttpURLConnection請求時傳中文參數亂碼問題

解決HttpURLConnection請求時傳中文參數亂碼

前提: 項目的編碼是utf-8, 即要保證項目下所有文件的編碼都是utf-8
示例代碼如下:

/**
 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
 */
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setCharacterEncoding("utf-8");
    request.setCharacterEncoding("utf-8");
    response.setContentType("text/html;charset=utf-8");

    String mobilePhone = request.getParameter("mobilePhone");
    String realName = request.getParameter("realName");


    realName = URLEncoder.encode(realName, "utf-8");

    String params = "method=" + method 
            + "&appId=" + appId 
            + "&sign=" + sign
            + "&timestamp=" + timestamp
            + "&mdn=" + mobilePhone
            + "&realName=" + realName;

    String returnStr = ApiUtil.getResult(Constants.CLOUD_API, params, "utf-8");
    JSONObject jo = (JSONObject) JSONObject.parse(returnStr);

    response.getWriter().print(jo);
    response.getWriter().flush();
    response.getWriter().close();

}

/**
 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
 */
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    this.doGet(request, response);
}

realName可能出現中文, 我們對其進行URLEncoder編碼, ApiUtil.getResult(Constants.CLOUD_API, params, "utf-8");這裏傳遞utf-8參數

/** 
 * @param urlStr 
 *            請求的地址 
 * @param content 
 *            請求的參數 格式爲:name=xxx&pwd=xxx 
 * @param encoding 
 *            服務器端請求編碼。如GBK,UTF-8等 
 * @return 
 */  
public static String getResult(String urlStr, String content, String encoding) {  
    URL url = null;  
    HttpURLConnection connection = null;  
    try {  
        url = new URL(urlStr);  
        connection = (HttpURLConnection) url.openConnection();// 新建連接實例  
        connection.setConnectTimeout(2000);// 設置連接超時時間,單位毫秒  
        connection.setReadTimeout(2000);// 設置讀取數據超時時間,單位毫秒  
        connection.setDoOutput(true);// 是否打開輸出流 true|false  
        connection.setDoInput(true);// 是否打開輸入流true|false  
        connection.setRequestMethod("POST");// 提交方法POST|GET  
        connection.setUseCaches(false);// 是否緩存true|false
        connection.setRequestProperty("Accept-Charset", encoding);
        connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=" + encoding);
        connection.connect();// 打開連接端口  
        DataOutputStream out = new DataOutputStream(connection  
                .getOutputStream());// 打開輸出流往對端服務器寫數據  
        out.writeBytes(content);// 寫數據,也就是提交你的表單 name=xxx&pwd=xxx  
        out.flush();// 刷新  
        out.close();// 關閉輸出流  
        BufferedReader reader = new BufferedReader(new InputStreamReader(  
                connection.getInputStream(), encoding));// 往對端寫完數據對端服務器返回數據  
        // ,以BufferedReader流來讀取  
        StringBuffer buffer = new StringBuffer();  
        String line = "";  
        while ((line = reader.readLine()) != null) {  
            buffer.append(line);  
        }  
        reader.close();  
        return buffer.toString();  
    } catch (IOException e) {  
        e.printStackTrace();  
    } finally {  
        if (connection != null) {  
            connection.disconnect();// 關閉連接  
        }  
    }  
    return null;  
}

標準的 HTTP POST 是一種 application/x-www-form-urlencoded 類型的網絡表單,傳遞的參數都會被寫入請求信息主體中。

connection.setRequestProperty("Accept-Charset", encoding);
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=" + encoding);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章