Jakarta HttpClient是否适合以下任务?

时间:2009-09-24 18:03:37

标签: java

我尝试通过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。

2 个答案:

答案 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,您应该是金色的。