web-dev-qa-db-ja.com

Spring RestTemplate-リクエスト本文を含むhttp GET

重複の可能性:
HTTP GET with request body

HTTP GETを介してコンテンツを送信することを推奨しないいくつかのディスカッションを読みました。クライアント(ウェブブラウザ)経由で送信できるデータのサイズには制限があります。また、GETデータの処理もサーバーに依存します。以下のセクションResourcesを参照してください。

ただし、RestTemplateを使用してHTTP GET経由でコンテンツを送信する可能性をテストするように求められました。私は春のフォーラムでいくつかの議論を参照しましたが、それらは答えられませんでした。 (http Post経由でのデータ送信は問題なく機能することに注意してください)。ディスカッション ここ は、代わりにPOSTを使用することを提案しています。

開発環境-JBoss AS 5.1、Spring 3.1.3

クライアント

    @Test
public void testGetWithBody()
{
    // acceptable media type
    List<MediaType> acceptableMediaTypes = new ArrayList<MediaType>();
    acceptableMediaTypes.add(MediaType.TEXT_PLAIN);

    // header
    HttpHeaders headers = new HttpHeaders();
    headers.setAccept(acceptableMediaTypes);

    // body
    String body = "hello world";
    HttpEntity<String> entity = new HttpEntity<String>(body, headers);

    Map<String, Object> uriVariables = new HashMap<String, Object>();
    uriVariables.put("id", "testFile");

    // Send the request as GET
    ResponseEntity<String> result = restTemplate.exchange(
            "http://localhost:8080/WebApp/test/{id}/body",
            HttpMethod.GET, entity, String.class, uriVariables);

    Assert.assertNotNull(result.getBody());
}

サーバー@コントローラー

    @RequestMapping(value = "/{id}/body", method = RequestMethod.GET)
public @ResponseBody
String testGetWithBody(@PathVariable String id,
        @RequestBody String bodyContent)
{
    return id + bodyContent;
}

問題-このテストケースを実行すると、500内部サーバーエラーが返されます。デバッグ時に、コントローラーがヒットしていないことがわかりました。

  1. RestTemplateがデータをリクエスト本文として送信する方法を提供することを理解するのは正しいのですが、サーバーがリクエスト本文を処理できなかったためにエラーが発生しますか?

  2. HTTP Getを介して送信されるリクエストボディが従来のものではない場合、RestTemplateがAPIを提供して送信を許可するのはなぜですか?これは、GETを介してリクエストの本文を処理できるサーバーがほとんどないことを意味しますか?

Resources-Spring ForumでRestTemplateを使用してHTTP GETで本文を送信することに関するディスカッション

http://forum.springsource.org/showthread.php?129510-Message-body-with-HTTP-GET&highlight=resttemplate+http+get

http://forum.springsource.org/showthread.php?94201-GET-method-on-RestTemplate-exchange-with-a-Body&highlight=resttemplate+http+get

Resources-HTTP GETを介した本文の送信に関する一般的な議論

get-with-request-body

is-this-statement-correct-http-get-method-always-has-no-message-body

get-or-post-when-reading-request-body

http-uri-get-limit

15
Tushar Mishra

RestTemplateがデータをリクエスト本文として送信する方法を提供することを理解するのは正しいのですが、サーバーがリクエスト本文を処理できなかったためにエラーが発生しますか?

ネットワークトラフィック(リクエストの本文とGETメソッドでリクエストが送信されますか)とサーバーログ(受信した500件の結果にログが記録されるサーバー側の影響があり、そうでない場合は構成する)を見ればわかりますそうするサーバー)。

HTTP Getを介して送信されるリクエストボディが従来のものではない場合、RestTemplateがAPIを提供して送信を許可するのはなぜですか?これは、GETを介してリクエストの本文を処理できるサーバーがほとんどないことを意味しますか?

これは、メッセージ本文を含めることができるリクエストを作成することもできる汎用クラスであるためです。

HTTP GET with request body で述べたように:

つまり、HTTPリクエストメッセージにはメッセージ本文を含めることができるため、[サーバー]はそれを考慮してメッセージを解析する必要があります。ただし、GETのサーバーセマンティクスは制限されており、本文が存在しても、リクエストに対してセマンティックな意味はありません。解析の要件は、メソッドのセマンティクスの要件とは異なります。

GETの本体は意味的に何もできませんあなたがを要求しているためリソース。それはあなたがサーバーに言うようなものです:「リソースXをください、ああ、りんごをいくつか持ってください!」。サーバーはあなたのリンゴを気にせず、喜んでリソースXにサービスを提供します。または、リクエスト内のオファーを好きではないため、エラーをスローします。

ただし、HTTP GETを介してコンテンツを送信する可能性をテストするように求められました

これを要求した人に、これをサポートする賢明な実装がないため、テストする必要がないケースであることを伝えてください。

7
CodeCaster