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

Dat*_*tic 8 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);
Run Code Online (Sandbox Code Playgroud)

如何传输参数和身体?

Mat*_*ple 4

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