http请求经常会遇到一些奇怪的问题,例如发送请求失败,或者response出现问题,或者参数中带了url调接口失败,调用微信接口失败,调用nginx转发失败,等等。
但用postman调用不会有问题。
这说明参数本身没有问题,服务器也没有问题,是客户端的问题。在你的代码里面,客户端就是你调用的那些发http的包。例如httpclient。
通常都是body没有设置字符集。
例如
HttpPost httpPost = new HttpPost(url);
StringEntity body = new StringEntity(jsonStr, "UTF-8");
httpPost.setEntity(body);
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList,"UTF-8");
httpPost.setEntity(entity);
简单说就是要给特殊字符编码。body中的那些特殊字符需要编码。有时是用
URLEncoder.encode(bodyStr, "UTF-8");
例如StringEntity的源码:他将传进来的body内容转成byte数组。所以就无需URLEncoder。
但这里charset默认是ISO8859-1,所以需要指定UTF-8。
public class StringEntity extends AbstractHttpEntity implements Cloneable {protected final byte[] content;public StringEntity(String string, ContentType contentType){Charset charset = contentType != null ? contentType.getCharset() : null;this.content = string.getBytes(charset);}
}