一次次检讨自己的代码,确实没有什么问题。眼看着交工的dead line要到了,没办法。赶紧把以前的一份用java原生的HttpUrlConnection发送POST要求的代码拿来改了改,测试成功。
但是心里以为太奇怪,没道理httpclient不好使啊。
我倒要看看他们发出的包到底有什么不一样。

抓包工具我这边利用的是fiddler。关于fiddler的基本操作这里就不讲了。
利用postman的要求包:
对代码进行抓包。这里有点操作须要讲讲了。
首先看下你的抓包工具监听的端口是啥,默认是8888.
然后须要对代码进行一些改造。fiddler可以方便的抓取浏览器,操作系统的http要求,但是我们在代码里发出的http,fiddler是抓不到的。须要在代码里设置代理。
java HttpUrlConnection的要求包:
设置代理的代码:
Proxyproxy=newProxy(java.net.Proxy.Type.HTTP, newInetSocketAddress("127.0.0.1",8888));URLrealUrl=newURL(url);HttpURLConnectionurlConnection=(HttpURLConnection)realUrl.openConnection(proxy);
利用apache commons 的HttpClient
设置代理的代码:
//设置代理IP、端口、协议(请分别更换)HttpHost proxy = new HttpHost("127.0.0.1", 8888, "http");//把代理设置到要求配置RequestConfig defaultRequestConfig = RequestConfig.custom() .setProxy(proxy) .build();CloseableHttpClient client = HttpClients.custom().setDefaultRequestConfig(defaultRequestConfig).build();
通过抓包,创造了问题的根源原来是中文乱码。又是编码问题。
问题办理:通过自定义一个contentType
ContentTypecontentType=ContentType.create("text/plain",Charset.forName("UTF-8"));
然后在addTextBody时,指明利用自定义的这个contentType
builder.addTextBody(entry.getKey(), entry.getValue(), ContentType.TEXT_PLAIN);
测试,好了
text/plain和一个ContentType.TEXT_PLAIN很像啊,
改成ContentType.TEXT_PLAIN试试,创造也弗成。我们来比拟下:
ContentType.create("text/plain", Charset.forName("UTF-8"));
ContentType TEXT_PLAIN = create("text/plain", Consts.ISO_8859_1);
末了创造是编码格式的问题。
一句话,记住:通过httpClient发送form表单中有中文的,要设置编码格式为ContentType.create("text/plain", Charset.forName("UTF-8"));
详细源码可查阅公众号:技能条记与开源分享