Java 雅加达HttpClient是否适用于以下任务?

Java 雅加达HttpClient是否适用于以下任务?,java,Java,我尝试通过telnet与服务器通话,并通过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,

我尝试通过telnet与服务器通话,并通过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

但是,当我对NameValuePair使用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。

它正在获取URL编码,因为您使用HTTPClient生成的请求可能是GET请求而不是POST,并且缺少以下标题:

Content-Type: application/x-www-form-urlencoded

寻找HTTPClient设置以正确设置内容类型标题,并确保您的请求是POST而不是get,并且您应该是golden。

正如我在另一个线程中提到的,这甚至不是有效的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);
            ...

否。使用post.setRequestHeader(“内容类型”,“应用程序/x-www-form-urlencoded”);也不行。它仍在被编码。这是因为ZZ编码器提到的。您依赖的是一个格式不正确的邮件正文。它的编码不正确。如果您将接收端修复为处理一个有效的帖子主体,它将起作用。我只是决定放弃并使用URLConnection。你的建议救我:)