解決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
+ "×tamp=" + 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);