如何使用Java进行POST并包含参数和原始请求体?

时间:2012-10-01 01:50:33

标签: java apache-commons-httpclient

我正在与期望POST参数并期望Request body的Web服务进行通信。我已经确认可以使用我的REST控制台完成这样的POST请求,但是我无法使用Apache库在Java中发出这样的请求。

在下面的代码中,我能够POST到Web服务,并且它正确地接收变量raw_body的内容。如果我取消注释两个注释行中的第一行,则Web服务会收到“fname”参数,但它不再接收POST的正文。

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.RequestEntity;
...

HttpClient httpClient = new HttpClient();
String urlStr = "http://localhost:8080/MyRestWebService/save";
PostMethod method = new PostMethod(urlStr);
String raw_body = "This is a very long string, much too long to be just another parameter";
RequestEntity re = new StringRequestEntity(raw_body, "text/xml", "UTF-16");
//method.addParameter("fname", "test.txt");
//httpClient.getParams().setParameter("fname", "test.txt");
method.setRequestEntity(re);

如何传输参数和身体?

2 个答案:

答案 0 :(得分:4)

您可以使用setQueryString方法将参数添加到要发布到的URL。从RESTful的角度来看,我认为你通常不会这样做,但是,因为POST应该表示对资源的调用,并且任何符合查询参数条件的东西都应该包含在请求中传输的表示中。 body ...或它应该代表资源本身的资格,在这种情况下它应该是发布的路径的一部分,然后控制器可以使用@ PathVariable / @ PathParam或类似的东西来提取它。因此,在您的情况下,如果您要保存资源并知道URI,那么您也可能正在寻找类似POST /MyRestWebService/files/test.txt或更合适的PUT的内容。服务器上的代码可以从URL模式中提取文件名。

答案 1 :(得分:3)

您需要使用multipart-form发出POST请求。这是一个例子:

Apache HttpClient making multipart form post

或者,您可以使用application/x-www-form-urlencoded编码的内容(参数和文件)发出POST请求,但是当您想要发出包含大量内容的POST请求时,不建议这样做。