最近、WebAPIを使うとブラウザがWebAPIにアクセスし、デフォルトはXML形式です。この返されるデータ形式はユーザーがカスタマイズ可能で、サーバーコードの設定の代わりにXML形式やJSON形式を返せるようにすべきだと思います!
サーバーコードは設定可能ですが、WebAPIの元々の意図ではなかったと思います。
1. WebAPIはデフォルトでどのデータ型を返しますか?jsonかxmlか? 2. WebAPIのリターンデータ型を変更する方法 IEブラウザで返されるデータがJSON形式であることを要求し、FirefoxやChromeから返されるデータ形式はXMLです。そしてHttpWebRequestで返すのがJSON形式であることを要求します。なぜ同じプログラムで同じ設定ファイルなのか、なぜ出力データ形式が違うのか、デフォルトでJSONやXMLは理解できるのに、なぜブラウザが違うのか、出力フォーマットが違うのか、疑問に思いました。 調べた結果、ついに理由が分かりました
テストの結果、IEブラウザで返されるデータはjson、FirefoxやChromeで返されるデータはxmlであり、IEはHTTPリクエスト時にFirefoxやChromeに比べて「application/xml」タイプが欠けていることが判明しました。 したがって、デフォルトはjson形式のデータですが、FirefoxやChromeは許容可能なxmlタイプを送るためxmlデータが返されます。以下はIE、Firefox、Chromeのリクエストヘッダーです
「承諾」はリクエストにのみ表示されます
意味:ブラウザ側で許容されるメディアの種類
例えば、Accept: text/htmlとは、ブラウザがサーバーからのポストバックタイプをテキスト/HTMLとして受け付けられることを意味します。これを一般にHTMLドキュメントと呼びます
もしサーバーがテキスト/HTML型のデータを返せない場合は、406エラー(受け入れられない)を返すべきです。
ワイルドカード * は任意の型を表します
例えば、Accept: */* はブラウザがすべてのタイプを処理できることを示します(一般的にブラウザはこれをサーバーに送信します)
例えば、Accept: text/* はすべてのテキストのサブクラスが許容されることを意味します
Acceptは複数の種類の分離をサポートできます
例えば、Accept: audio/*; q=0.2の場合、audio/basicはブラウザがオーディオやbasicメディアタイプを好むことを意味しますが、このタイプがなければ他のオーディオタイプも使えます
ここでq=0.2が現れ、これは関連度を表す値であり、デフォルト値は1で、最大から小さい順に並べて
例えば、Accept: text/plain; q=0.5, text/html, text/x-DVI; q=0.8, text/x-c
許容される型の優先順位は以下の通りです
1) テキスト/HTMLテキスト/x-c
2) テキスト/x-DVI
3) テキスト/プレーン
qは0から1の間、qのデフォルト値は1、q=0は許容できないことを意味します
最後に、検査結果です:
| ブラウザー | フォーマットへの回帰 | Accept request ヘッダー | | つまり | JSON | テキスト/html、アプリケーション/xhtml+xml、*/* | | クローム | XML | テキスト/html、アプリケーション/xHTML+xml、アプリケーション/xml; q=0.9,image/webp,image/apng,*/*; q=0.8 | | Firefox | XML | テキスト/html、アプリケーション/xHTML+xml、アプリケーション/xml; q=0.9,*/*; q=0.8,*/* |
以下のテストを続けてください
1. accept:application/jsonのみを送信し、結果はjsonとして返されます
2. accept:application/xmlだけを送信し、その結果はxmlを返します
3. accept: application/xmlとapplication/jsonを同時に送信すると、jsonが返されます
4. accept:application/jsonとapplication/xmlを同時に送信すると、結果はjsonを返します
5. 優先順位を変更し、同時にapplication/xmlを送信する。 q=1.0,application/json; q=0.9であり、結果はXMLを返しました
ここから結論づけられます:
WebAPIのリターンデータ型はリクエストヘッダーの受諾によって決まり、デフォルトのリターンタイプはjsonです 1. application/jsonもapplication/xmlも存在しない場合は、jsonデータを返す 2. application/jsonのみが利用可能の場合、jsonデータを返す 3. application/xmlのみが利用可能の場合、xmlデータが返されます 4. application/jsonとapplication/jsonが同時に存在する場合、返されるデータ型は両者の順序には関係ありません。同じ優先度の場合はjsonを返し、優先度が異なる場合はより高い優先度の型を返します
| 頭を受け入れろ | リターンタイプ | | application/json | JSON | | application/xml | XML | | application/xml,application/json | JSON | | application/json,application/xml | JSON | | application/xml; q=1.0,application/json; q=1.0 | JSON | | application/xml; q=0.9,application/json; q=0.9 | JSON | | application/xml; q=1.0,application/json; q=0.9 | XML | | application/xml; q=0.9,application/json; q=1.0 | JSON |
以下に示すように:
|