我尝试通过telneting与服务器通信,并通过telnet终端发送以下命令:
POST /%5bvUpJYKw4QvGRMBmhATUxRwv4JrU9aDnwNEuangVyy6OuHxi2YiY=%5dImage? HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 164
[SORT]=0,1,0,10,5,0,KL,0&[FIELD]=33,38,51,58,68,88,78,98,99,101,56,57,69,70,71,72,89,90,91,92,59,60,61,62,79,80,81,82&[LIST]=1155.KL,1295.KL,7191.KL,0097.KL,2267.KL
这很好用。现在,我希望我可以使用HttpClient与服务器通信,因为我使用telnet与服务器通信。我希望使用HttpClient而不是使用原始TCP套接字的原因是因为HttpClient支持NTLM。
但是,当我使用PostValuePair的POST方法时:
new NameValuePair("[SORT]", "0,1,0,10,5,0,KL,0")
请求将成为URL编码。服务器无法理解URL编码请求。
%5BSORT%5D: 0%2C1%2C0%2C10%2C5%2C0%2CKL%2C0
有什么方法可以避免这种情况吗?如果没有,我可以使用的替代库是什么?我也希望支持NTLM。
答案 0 :(得分:1)
正如我在另一个帖子中提到的,这甚至不是有效的HTTP POST。所以你不能用HttpClient中的默认post机制来做。你需要自己制作无效的身体并发布它。
假设您正在使用HttpClient 3,以下代码应该可以使用
HttpClient httpClient = new HttpClient();
PostMethod method = new PostMethod(url);
String badFormPost = "[SORT]=0,1,0,10,5,0,KL,0&[FIELD]=33,38,51,58,68,88,78,98,99,101,56,57,69,70,71,72,89,90,91,92,59,60,61,62,79,80,81,82&[LIST]=1155.KL,1295.KL,7191.KL,0097.KL,2267.KL";
RequestEntity entity = new StringRequestEntity(badFormPost,
"application/x-www-form-urlencoded", "UTF-8");
method.setRequestEntity(entity);
method.setContentChunked(false);
httpClient.executeMethod(method);
...
答案 1 :(得分:0)
它正在进行URL编码,因为您使用HTTPClient创建的请求可能是GET请求而不是POST并且缺少此标头:
Content-Type: application/x-www-form-urlencoded
查找HTTPClient设置以正确设置Content-Type标头,并确保您的请求是POST,而不是get,您应该是金色的。