问题背景
程序需要调用第三方的接口通过http方式,调用方式及为post请求方式传入json串的格式,通过程序调用后发现是http1.1格式的,然后返回400状态码。以为是参数json有问题,但同样的参数拷贝后拿到postman之行则可以成功。
问题复线
问题代码如下:
public static void testHttp(String json){
HttpClient client= new DefaultHttpClient();
HttpPost request = new HttpPost("http://method.com/skin/api/v01");
request.setHeader("Content-Type","application/json; charset=utf-8");
try {
request.setEntity(new StringEntity(json,Charset.forName("UTF-8")));
HttpResponse resp = client.execute(request);
HttpEntity entity = resp.getEntity();
System.out.println(entity.toString());
if(entity!=null){
//解析返回数据
String result = EntityUtils.toString(entity,"UTF-8");
System.out.println(result);
}
} catch (Exception e) {
e.printStackTrace();
}
}
如上代码,发送请求后发现是http1.1格式的,然后返回400 code码,一般400 code码都是参数封装错误。
问题解决
经过各种方式尝试最终发现只需将代码中的 Content-Type 类型由 application/json; charset=utf-8 改为 application/json 后,请求神奇的通了。
但是 charset = utf-8 的作用指定要以JSON格式的内容,以UTF-8字符编码进行编码,但指定编码对于JSON有点多余,因为JSON的默认编码是UTF-8。所以有点儿莫名其妙,也可能是我没有真正懂得这个参数的含义,不过大概率是因为接收方设置问题。