8

我正在与一个需要 POST 参数并且还需要请求正文的 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);

如何同时传输参数和正文?

4

2 回答 2

4

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

于 2012-10-01T02:12:06.690 回答
3

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

Apache HttpClient 制作多部分表单帖子

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

于 2012-10-01T01:53:53.020 回答