8

POST パラメーターを期待し、要求本文も期待する Web サービスと通信しています。このような POST リクエストは、私が持っている REST コンソールを使用して実行できることを確認しましたが、Java で Apache ライブラリを使用してそのようなリクエストを行うことができません。

以下のコードでは、Web サービスに POST でき、変数 raw_body の内容を正しく受け取ります。コメント化された 2 行のうち最初の行のコメントを外すと、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メソッドを使用して、POST される URL にパラメータを追加できます。RESTful な観点からは、POST はリソースへの呼び出しを表す必要があり、クエリ パラメーターに該当するものはすべて、リクエストで転送される表現に含める必要があるため、通常はそうすべきではないと主張します。本体...または、リソース自体の修飾を表す必要があります。この場合、@PathVariable/@PathParam または同様のものを使用してコントローラーによって抽出できるパスの一部である必要があります。したがって、あなたの場合POST /MyRestWebService/files/test.txt、リソースを保存していてURIを知っている場合は、PUTのようなもの、またはより適切なものを探すこともできます。サーバー上のコードは、URL パターンからファイル名を引き出すことができます。

于 2012-10-01T02:12:06.690 に答える
3

multipart-form を使用して POST リクエストを行う必要があります。次に例を示します。

マルチパートフォームポストを作成するApache HttpClient

または、 を使用してエンコードされたコンテンツ (パラメーターとファイル) を使用して POST 要求を行うこともできますが、application/x-www-form-urlencodedファイルなどの大きなコンテンツを含む POST 要求を行う場合はお勧めしません。

于 2012-10-01T01:53:53.020 に答える