今天在发送HTTP Post请求时,响应报文有时正常,有时乱码,也不是中文乱码,响应报文整个乱码,
最开始以为是InputStreamReader读取的时候字符编码导致,然后使用utf-8:
InputStreamReader isr = new InputStreamReader(is, "utf-8");
但是还是乱码,然后又想到可能是请求头的字符编码不正确导致,可是请求头也是utf-8,也不是这个
问题导致的,经过抓包发现,响应报文体乱码的请求头比不乱码的报文请求头多个属性:Accept-Encoding=gzip,
这个问题之前是遇到过的,但是突然忘记了,请求头带Accept-Encoding=gzip的时候,响应报文会被压缩,所以
解决办法有两种:
第一种(简单粗暴):
请求头中去掉Accept-Encoding的gzip即可
第二种(解码):
判断响应报文头中是否存在"Content-Encoding"属性,如果有,则判断是否存在"gzip",如果存在,则进行解压,
否则正常读取即可
public static Map<String, Object> httpRequestJson(String requestUrl, String requestMethod, String outputJsonStr, Proxy proxy) throws Exception {
Map<String, Object> resMap = new HashMap<String, Object>();
StringBuffer buffer = new StringBuffer();
HttpsURLConnection conn = null;
InputStream is = null;
OutputStream os = null;
try {
URL url = new URL(requestUrl);
if (null != proxy) {
SslUtil.ignoreSsl();
conn = (HttpsURLConnection) url.openConnection(proxy);
} else {
conn = (HttpsURLConnection) url.openConnection();
}
conn.setRequestMethod(requestMethod);
HttpHeadUtil.setSpdReqHead(conn);
if (null != outputJsonStr) {
os = conn.getOutputStream();
os.write(outputJsonStr.getBytes());
}
os.flush();
Map<String, List<String>> head = conn.getHeaderFields();
is = conn.getInputStream();
List<String> contentEncoding = (List<String>)head.get("Content-Encoding");
if (null != contentEncoding && (contentEncoding.contains("gzip") || contentEncoding.contains("GZIP"))) {
buffer = SpdConstant.zipInputStream(is);
} else {
InputStreamReader isr = new InputStreamReader(is, "utf-8");
BufferedReader br = new BufferedReader(isr);
String line = null;
while ((line = br.readLine()) != null) {
System.out.println("line:"+line);
buffer.append(line);
}
}
System.out.println("body:" + buffer.toString());
resMap.put("head", head);
resMap.put("body", buffer.toString());
} catch (Exception e) {
throw e;
} finally {
if (null != is) {
is.close();
}
if (null != os) {
os.close();
}
}
return resMap;
}
public static StringBuffer zipInputStream(InputStream is) throws IOException {
GZIPInputStream gzip = new GZIPInputStream(is);
BufferedReader in = new BufferedReader(new InputStreamReader(gzip, "UTF-8"));
StringBuffer buffer = new StringBuffer();
String line;
while ((line = in.readLine()) != null)
buffer.append(line + "\n");
return buffer;
}