解决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);