问题背景 程序需要调用第三方的接口通过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码都是参数封装错误。
问题解决 【日常错误|postman能正常请求但java程序请求返回400】经过各种方式尝试最终发现只需将代码中的 Content-Type 类型由 application/json; charset=utf-8 改为 application/json 后,请求神奇的通了。
但是 charset = utf-8 的作用指定要以JSON格式的内容,以UTF-8字符编码进行编码,但指定编码对于JSON有点多余,因为JSON的默认编码是UTF-8。所以有点儿莫名其妙,也可能是我没有真正懂得这个参数的含义,不过大概率是因为接收方设置问题。
推荐阅读
- ServletException: java.lang.ExceptionInInitializerError
- 微服务系列|微服务系列(Spring Cloud Alibaba 之 Nacos 集群搭建)
- 分布式|SpringCloud Netflix-Eureka使用
- springcloud|springcloud-02-eureka(服务注册与发现)
- docker|docker和k8s面试题总结(未完待续)
- 前端面试题|【牛客网-公司真题-前端入门篇】——2021牛客模考-卷1
- 后端|GitHub 又爆新作!2 份 PDF+1 个插件算法刷题三件套!面试进阶双飞
- servlet|vue3验证码倒计时60秒(自用)
- Java|基于Vue的仿小米商城