春のMVCのコンテンツネゴシエーションを理解するために、1は最初のHTTPコンテンツのネゴシエーションの仕組みを理解しておく必要があり、SpringMVCが同時HTTPコンテンツネゴシエーションを達成し、それが拡張されました。
HTTPコンテンツネゴシエーション
サーバリソースのURLはレスポンスの複数の形態、すなわち、MIME(メディアタイプ)メディアタイプを持つことができます。しかし、クライアントは、クライアントとサーバ間のメカニズムを必要とするのだけを必要とする、サーバーの応答は、クライアントがコンテンツネゴシエーションのある、望んでいることを確認します。
通常、2つの方法でコンテンツネゴシエーションが、最初は、クライアントが利用可能なサーバーのリストで、クライアントはよりインタラクティブになり、このようにネットワークを介して送信し、サーバとを選択し、平均的なユーザーは、技術的なオプションを理解することはほとんどありませんので、このアプローチは、一般的ではありません。そのようなコンテンツタイプとして、コンテンツは、クライアント要求によってサーバから返さに形態が対応し、第1の記述に応答して、第2のアプローチは、一般にMIMEクライアントは、HTTP Acceptヘッダー部として、要求を送信するのに必要な時間を示すために使用されます。以下の表:
リクエストヘッダ | リクエストヘッダは説明します | レスポンスヘッダ | 説明レスポンスヘッダ |
受け入れます | サーバーは、MIMEを必要と知らせます | コンテンツタイプ | メディアタイプに応じてクライアントに知らせます |
受け入れる言語 | サーバーのニーズ言語に知らせます | コンテンツ言語 | 言語は、クライアントの応答を伝えます |
受け入れ、文字セット | 文字セットを必要とするサーバーに知らせます | コンテンツ文字セット | クライアントの文字セットからの応答を知らせます |
受け入れエンコード | 必要なサーバーを伝えるための圧縮方法 | コンテンツのエンコード | 圧縮クライアントの応答を知らせます |
見た目のリクエストヘッダの例:
まず、重量qを説明1まで、権利を意味し、0の最小値は、デフォルトは1です。
受け入れ:* / *ようにtext / htmlの、MIMEリソースはtext / plainなど、他のことができ表します。
-エンコーディングを受け入れる:圧縮はBR、gzipでも収縮させることができます。リソースサーバーは、圧縮によって、ボリュームを減らすことができるクライアントに送信します。
受け入れる言語:中国の最高重量の権利を。ここでは、ブラウザは、オペレーティングシステムやブラウザの言語自体の言語に応じて選択されるが、交渉が成功したかどうかは、サーバーが複数の言語をサポートしているかどうかに依存することができます。
レスポンスヘッダの一例を見て:
コンテンツエンコード:方法の説明はgzip圧縮です。
コンテンツの種類:テキスト、HTMLをMIME文字セットがUTF-8で表されます
Spring MVCのコンテントネゴシエーション
スプリングMVCは、コンテンツネゴシエーションの4種類のサポート:HTTPヘッダは、拡張、要求パラメータ、または固定タイプを受け入れます。我々は、例によって検証されています。
@RestController @RequestMapping( "/ユーザ" ) パブリック クラスUserControllerで{ @RequestMapping( "{ID}" ) パブリックユーザ(@PathVariable整数ID)を取得{ 戻り 、新しい( "呵呵" ID、ユーザー) } }
パブリッククラスユーザー{
民間の整数ID。
プライベート文字列名;
ユーザ(整数ID、文字列名){
this.id = ID。
this.name =名前;
}
公共の整数のgetId(){
IDを返します。
}
公共ボイドSETID(整数ID){
this.id = ID。
}
パブリック文字列のgetName(){
名前を返します。
}
公共ボイドのsetName(文字列名){
this.name =名前;
}
}
MIMEのXMLとJSON 2種類を検証するために、我々は2つの従属jarファイルのJSONとXML MessageConvertorのデフォルトを変換する際に、次の2つのJARパッケージ、SpringMVCを使用する必要があります
< 依存性> < のgroupId > com.fasterxml.jackson.core </ のgroupId > < たartifactId >ジャクソンデータバインド</ たartifactId > < バージョン> 2.6.4 </ バージョン> </ 依存> < 依存性> < のgroupId > com.fasterxml.jackson.dataformat </ のgroupId > < たartifactId >ジャクソン・データ形式、XML </ たartifactId > < バージョン> 2.9.9 </ バージョン> </ 依存>
受け入れます
ブラウザに入力します。HTTP:// localhostを:8080 / MVC /ユーザ/ 1、応答結果は次のとおりです。
<ユーザー> <ID> 1 </ ID> <名前>呵呵</名前> </ユーザー>
あなたは、XML形式で返されたデータを見ることができます
そして、ポストマンテスト
データのJSON形式を返し、そしてなぜブラウザが同じではありませんか?実際には、問題は、Qの重量設定です。
お使いのブラウザの設定を受け入れます。
我々は@RestControllerノートを使用しているので、ビューを返さない、すべてのテキスト/ HTMLを返さないブラウザのリクエスト、アプリケーション/ XHTML + xml形式を受け入れ、あなたは体重を取るアプリケーション0.9 / XMLが返されます。
要求ポストマンでは、任意のフォーマットを受け入れ、スプリングMVCは、JSONのXML以外、それによって検証高い優先順位をJSON形式のデータを返さ。
だから、ポストマンは、XML形式でデータを返す方法、それに値を受け入れる変更します。
私たちは、Spring MVCのは、完全にコンテンツネゴシエーションHTTPはのヘッダーを受け入れるサポートを確認しました。
拡張
私たちは、追加のSpring MVCは、受け入れの値を無視する拡張を特定できる場合は、URLを設定することにより、MIME拡張子を指定する必要があるかもしれません。
HTTPで:// localhostを:8080 / MVC /ユーザ/ 1と背面、得られたデータに対応するそれぞれプラス.jsonの.xmlファイル形式はないマッピング、戻されます。一見拡張を集中し、優先順位を受け入れます:
したがって、検証延長は受け入れよりも優先順位が高いです。
リクエストパラメータ
リクエストパラメータのコンテンツネゴシエーションは、私たちが手動で開いて、デフォルトではオフになっています。
@Configuration @EnableWebMvc @ComponentScan( "com.acwei.spring.mvc" ) パブリック クラス MvcConfigurationが延びWebMvcConfigurerAdapterを{ @豆 public LogInterceptor logInterceptor() { return new LogInterceptor(); } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(logInterceptor()).addPathPatterns("/**"); } @Override public void configureContentNegotiation(ContentNegotiationConfigurer configurer) { configurer.favorParameter(true); } }
在configureContentNegotiation方法中打开请求参数内容协商设置,注意:请求参数机制优先级低于扩展名,所以我们验证时候先把url后缀去掉:
可以看到请求参数的优先级高于Accept。综合上面的实验可以得出几种机制的优先级:后缀 > 请求参数 > HTTP首部Accept。
固定类型
最后一种就是@RequestMapping注解属性produces:
响应的MIME在这里指定,需要说明的是,这里指定的类型不能和后缀、请求参数、Accept冲突。比如这里指定了json格式,那么后缀如果不是json,或者format不是json,或者Accept不是application/json、*/*,将无法完成内容协商,http status code为406。