web-dev-qa-db-ja.com

Spring 4 @ RequestMapping-vsヘッダーを消費しますか?

Spring4を使用してRESTfulWebサービスを構築する方法を学んでいますが、はっきりしないことが1つあります。それは@RequestMappingにあります。 headers = "Accept=application/xml"を使用する例や、= "application/xml"を消費(または生成)する他の例を見てきました。

たとえば、私自身の@RestControllerクラスには、この関数があります...

// POST
@RequestMapping(method = RequestMethod.POST, headers = "Accept=application/xml")
public User create(@RequestBody User user) {
    LOG.info("User = " + user.toString());
return userService.create(user);
}

headers = "Accept=application/xml"を使用する場合と消費= "application/xml"?を使用する場合、またはheaders = "content-type=application/xml"を使用する場合の違いは何ですか?

誰かがヘッダーと消費/生成の違い、およびそれぞれがいつ使用されるかを説明できますか?

12
Chris

短い答え
上記の例では、headers = "Accept=application/xml"またはproduces = "application/xml"を使用すると、どちらも同じ方法でクライアントに応答します。つまり、XML表現でクライアントに応答を送信します。

長い答え
i。ヘッダー
RESTful Webサービスの場合、クライアント(ブラウザーなど)はサーバーに要求(GET、POSTなど)を送信し、サーバーは応答を送り返します。これはHTTPトランザクションです。要求と応答の両方にHTTPヘッダーフィールド(「ヘッダー」)があり、HTTPトランザクションの動作パラメーターを定義します(クライアント要求のヘッダーを「要求ヘッダー」と呼びます。これらはサーバー応答「応答」のヘッダーとは異なります。ヘッダー」)。

ブラウザがサーバーに送信するリクエストの一部として、さまざまなリクエストヘッダーがあり、いくつかの例にはAcceptConnectionContent-Lengthなどがあり、これらのヘッダーにはそれぞれ独自の機能があります(詳細はこちらをご覧ください)。ここにヘッダーのリスト: https://en.wikipedia.org/wiki/List_of_HTTP_header_fields )。

コード例を使用すると、クライアントがPOSTリクエストを実行すると、Springはリクエストヘッダーをチェックし、値がapplication/xmlのヘッダーAcceptを見つけた場合、リクエストを上記のcreateメソッドにマップします(この場合、サーバーはXML応答表現をクライアントに返します)。

指定したコードのheaders要素を変更します。

@RequestMapping(method = RequestMethod.POST, headers = "Connection=keep-alive")
public User create(@RequestBody User user) {
 ...
}

headers要素の値がConnection=keep-aliveになっていることに注意してください。クライアントがPOSTリクエストを実行すると、Springはリクエストヘッダーをチェックし、値がkeep-aliveのヘッダーConnectionを見つけた場合、そのクライアントリクエストをマッピングします。上記のcreateメソッドに。

ii。生産と消費
createメソッドにproduces="application/xml"を使用した場合、これは、クライアントのcreateヘッダーがapplication/xmlと一致する場合にのみ、クライアント要求がAcceptメソッドにマップされることを意味します。これは基本的に、「サーバーさん、XML表現で応答を受け入れることを好むので、XMLで応答を送信してください」と言っているクライアントです。事実上、produces="application/xml"はサーバーでもあり、「クライアントさん、XML表現でしか応答を生成できないので、その形式で送信します」と言っています。 Springドキュメントリファレンスへのリンク

createメソッドにconsumes="application/xml"を使用した場合、これは、クライアントのContent-Typeヘッダーがapplication/xmlと一致する場合にのみクライアントリクエストがcreateメソッドにマップされることを意味します(Content-Typeリクエストヘッダーはクライアントリクエストの表現を記述します)入ってきます)。これは基本的に、「クライアントさん、リクエストはXML表現でしか使用できないので、その形式を送信してください」というサーバーです。

[〜#〜]概要[〜#〜]
@RequestMappingアノテーション内のheaders要素は異なるリクエストヘッダー(AcceptConnectionCache-Controlなど)を取ることができますが、produces要素はAcceptリクエストヘッダーのみに関係し、consumes要素はContent-Typeリクエストヘッダーのみに関係します。

29
Alex Ander

HeadersRequestCondition@RequestMappingアノテーションのheaders属性で提供される値を処理する)のjavadocが述べているように

ヘッダー名が「Accept」または「Content-Type」のコンストラクターに渡された式は無視されます。それらについては、 ConsumesRequestCondition および ProducesRequestCondition を参照してください。

したがって、headersでこれらのヘッダーを使用しないでください。 producesおよびContent-TypeにはconsumesおよびAccept属性を使用します。

それらの使用方法については、ドキュメントに例が示されています: for consumes および for produces