この記事は機械翻訳のミラー記事です。元の記事にジャンプするにはこちらをクリックしてください。

眺める: 24777|答える: 3

[WebAPI] WebAPIはリターンデータ形式をカスタマイズします

[リンクをコピー]
掲載地 2017/11/30 11:00:16 | | | |
最近、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
FirefoxXMLテキスト/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/jsonJSON
application/xmlXML
application/xml,application/jsonJSON
application/json,application/xmlJSON
application/xml; q=1.0,application/json; q=1.0JSON
application/xml; q=0.9,application/json; q=0.9JSON
application/xml; q=1.0,application/json; q=0.9XML
application/xml; q=0.9,application/json; q=1.0JSON


以下に示すように:





先の:Python3は並行アクセスの水平パーティショニングテーブルを実装しています
次に:.Net MVCはロングポーリングを実装しています
掲載地 2017/11/30 11:06:08 |
驚きですね、以前にもこの状況を見つけたことがあるのに、なぜなのか考えていませんでした
 地主| 掲載地 2017/11/30 11:07:36 |
QWERTYU 2017年11月30日 11:06 投稿
驚きですね、以前にもこの状況を見つけたことがあるのに、なぜなのか考えていませんでした

場合によっては、JSON形式の返還が正常であり、XML形式を返すと例外が発生するため、XML形式の返送は控えることが推奨されます

例えば、返還値がオブジェクトの場合、返還JSON形式は通常、返還XML形式がエラーを報告します
掲載地 2018/04/25 8:50:44 |
講義は非常に詳細で、知識ポイントも含まれています。ありがとうございます。集められています
免責事項:
Code Farmer Networkが発行するすべてのソフトウェア、プログラミング資料、記事は学習および研究目的のみを目的としています。 上記の内容は商業的または違法な目的で使用されてはならず、そうでなければ利用者はすべての結果を負うことになります。 このサイトの情報はインターネットからのものであり、著作権紛争はこのサイトとは関係ありません。 ダウンロード後24時間以内に上記の内容を完全にパソコンから削除してください。 もしこのプログラムを気に入ったら、正規のソフトウェアを支持し、登録を購入し、より良い本物のサービスを受けてください。 もし侵害があれば、メールでご連絡ください。

Mail To:help@itsvse.com