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"
を使用する場合の違いは何ですか?
誰かがヘッダーと消費/生成の違い、およびそれぞれがいつ使用されるかを説明できますか?
短い答え
上記の例では、headers = "Accept=application/xml"
またはproduces = "application/xml"
を使用すると、どちらも同じ方法でクライアントに応答します。つまり、XML表現でクライアントに応答を送信します。
長い答え
i。ヘッダー
RESTful Webサービスの場合、クライアント(ブラウザーなど)はサーバーに要求(GET、POSTなど)を送信し、サーバーは応答を送り返します。これはHTTPトランザクションです。要求と応答の両方にHTTPヘッダーフィールド(「ヘッダー」)があり、HTTPトランザクションの動作パラメーターを定義します(クライアント要求のヘッダーを「要求ヘッダー」と呼びます。これらはサーバー応答「応答」のヘッダーとは異なります。ヘッダー」)。
ブラウザがサーバーに送信するリクエストの一部として、さまざまなリクエストヘッダーがあり、いくつかの例にはAccept
、Connection
、Content-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
要素は異なるリクエストヘッダー(Accept
、Connection
、Cache-Control
など)を取ることができますが、produces
要素はAccept
リクエストヘッダーのみに関係し、consumes
要素はContent-Type
リクエストヘッダーのみに関係します。
HeadersRequestCondition
(@RequestMapping
アノテーションのheaders
属性で提供される値を処理する)のjavadocが述べているように
ヘッダー名が「Accept」または「Content-Type」のコンストラクターに渡された式は無視されます。それらについては、
ConsumesRequestCondition
およびProducesRequestCondition
を参照してください。
したがって、headers
でこれらのヘッダーを使用しないでください。 produces
およびContent-Type
にはconsumes
およびAccept
属性を使用します。
それらの使用方法については、ドキュメントに例が示されています: for consumes
および for produces
。