web-dev-qa-db-ja.com

REST-Acceptヘッダーと拡張機能によるコンテンツネゴシエーションのトレードオフ

RESTful APIの設計に取り組んでいます。任意のリソースのJSONとXMLを返す必要があることはわかっています。私は次のようなことをすると思っていました:

GET /api/something?param1=value1
Accept:  application/xml (or application/json)

ただし、誰かがこのために拡張機能を使用して次のように投げました:

GET /api/something.xml?parm1=value1 (or /api/something.json?param1=value1)

これらのアプローチのトレードオフは何ですか?拡張機能が指定されていない場合はAcceptヘッダーに依存するのが最善ですが、拡張機能が指定されている場合はそれを優先しますか?そのアプローチには欠点がありますか?

40
Brandon Linton

これは、「しかし、哲学的に-最初のアプローチが唯一のアプローチです。」そしてこの「適切な公式のRESTfulなアプローチは、Accept:ヘッダーを使用することです。」 広く認識されているがそうであるが、絶対に正しくない

(RESTを定義した)Roy Fieldingの簡単なスニペットを次に示します...

「セクション6.2.1では、コンテンツネゴシエーションを常に使用する必要があるとは述べられていません。」 引用

その特定の会話は「Accept-Language:」ヘッダーのコンテキスト内にありますが、同じことが「Accept:」ヘッダーにも同様に適用されます。

「トップページの2番目と3番目のリンクが表示されない理由がわかりません。

http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm

2つのPDFエディションを指します。 "

彼が意味することは、同じソースデータの異なる表現に異なるエンドポイントを使用しても問題がないということです。 (この場合、1つの.htmlエンドポイントと2つの異なる.pdfエンドポイント。)

同様のディスカッションで、今回はクエリパラメータを使用することと、さまざまなメディアタイプのファイル拡張子を使用することの利点について...

「そのため、私は常に拡張機能を好みます。どちらもRESTとは関係ありません。」 引用

繰り返しますが、これはAcceptとファイル名の拡張子とは少し異なりますが、Fieldingのスタンスは依然として明確です。

回答-それは本当に大した問題ではありません。 2つの間のトレードオフはそれほど重要ではなく、どちらも許容できるスタイルです。

38
Tom Christie

適切な公式のRESTfulなアプローチはAccept:ヘッダー。

ただし、RESTの要件の1つであるキャッシュ可能性を損なわないように注意する必要があります。 Vary: Acceptヘッダーとそれを理解するキャッシュ。理想的な世界ではそれがありますが、実際にはあなたのミレージは異なるかもしれません。したがって、2番目のソリューションはそれほどクリーンではありませんが、より実用的かもしれません。

また、一部の非常に古いブラウザーはヘッダーを無視して、代わりに拡張機能に依存していたことにも注意してください。

10
vartec

技術的にはそれほど問題ではありません-Webサーバーは、見た目通り適切に処理を渡すことができます。 (私はこれを想定していますが、ショートッパーのようには見えません)。

しかし、哲学的には-最初のアプローチが唯一のアプローチです。 RESTでは、URLは実際にはURIのみを指します-これは単なるリソースです。オブジェクト指向プログラミングにおけるresourceobjectと同じように少し考えてみてください。あなたは4つのメソッド(別名GET/POST/PUT/DELETEまたはトランスポートで許可されている場合)を通じてこのリソースにtalkしますが、そのメソッドはオブジェクトのdescriptionにはなりません。同様に、戻り値のアスペクトはURIではありません。オブジェクトは引き続きsomethingであり、something.xmlまたはsomething.jsonではありません

Acceptヘッダーを使用したくないが、本当にREST哲学になりたい場合は、次のようなことは気にしません。

GET /api/something?parm1=value1&return_type=xml

とは対照的に

GET /api/something.xml?parm1=value1 (or /api/something.json?param1=value1)

しかし、私が言ったように、この違いは哲学的だけです。

9
Dipan Mehta

@vartec:私はあなたが間違っていると思います

適切な公式のRESTful原則は、公開または参照されるのはURIであるため、HTTPヘッダーには何も隠してはならないことを示し、リクエスト/応答に関する詳細はURIの一部として提供する必要があります

したがって、リクエストとレスポンスに関する詳細にはヘッダーを使用しないことを強くお勧めします。

 GET /api/something.xml?parm1=value1 (or /api/something.json?param1=value1)

参考文献をすぐに見つけることはできませんが、私はそれらを投稿します(実際には、O'reillyの出版物「RESTful Webサービス」を参照できます( http://shop.oreilly.com/product/ 9780596529260.do )同じことを確認します

0
Basav