1、问题描述
在做一个内网的项目时间遇到的问题,首先说下项目的背景,目的是做一个接口获取一个列表,
问题出在这个列表的请求参数上。
- 请求参数的类型是application/json
- 请求参数很复杂,有多复杂呢?
- 把所有的响应字段,也就是对象属性名作为数组 tableHeaderList成为请求参数中的一个
- 先请求第一页的数据,再请求总页数,总页数的参数中把第一页的整个响应数据json作为列表tableRowList成为请求总页数的请求参数中的一项数据
- 后续请求页数和前面差不多,比如你先获取第1页的数据,这时你想获取第3页的数据,那就是把第一页的响应数据json作为请求参数,以及对象属性名数组 tableHeaderList也是参数
- 问题出在页面的响应数据中包含大量的其他国家的语言,以及表情等等特殊字符
2、情景重现
这里大致的模拟下情况
HttpPost post = new HttpPost("请求地址");
String param = "json串";
post.setHeader("Content-Type","application/json; charset=UTF-8");
StringEntity entity = new StringEntity(new String(param));
poset.setEntity(entity);
这个时间出现的问题就是如果第一页没有特殊字符,总页数可以请求成功,如果第一页的数据中含有特殊字符,就响应400数据。
3、解决方法
这里我是百思不得解啊,后来请教我们的技术经理,解决方法很简单,就变动一个地方
HttpPost post = new HttpPost("请求地址");
String param = "json串";
post.setHeader("Content-Type","application/json; charset=UTF-8");
StringEntity entity = new StringEntity(new String(param),"UTF-8");//注意这里
poset.setEntity(entity);
也就是说参数的编码在content-type设置没有用,实体参数设置必须加编码才行