15

重複の可能性:
HTTP GET とリクエスト本文

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

ただし、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());
}

サーバー@Controller

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

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

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

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

リソース- 春のフォーラムで 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

リソース- 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

4

1 に答える 1

7

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

ネットワーク トラフィック (リクエストはリクエスト ボディと GET メソッドで送信されますか?) とサーバー ログ (受信した 500 の結果には、ログに記録されるサーバー側の効果が必要です。そうでない場合は、構成そうするためのサーバー)。

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

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

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

つまり、どの HTTP 要求メッセージにもメッセージ本文を含めることが許可されているため、[サーバー] はそれを念頭に置いてメッセージを解析する必要があります。ただし、GET のサーバー セマンティクスは制限されているため、ボディが存在する場合でも、リクエストに対してセマンティックな意味はありません。解析に関する要件は、メソッドのセマンティクスに関する要件とは別のものです。

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

ただし、HTTP GET 経由でコンテンツを送信する可能性をテストするように依頼されました。

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

于 2012-11-07T13:38:06.757 に答える