クライアントが特定のリソースにアクセスできるかどうかを判断するための REST API のベスト プラクティスを判断しようとしています。2 つの簡単なシナリオ例:
電話帳検索サービス。クライアントは、たとえばアクセスして電話番号を検索します。
GET http://host/directoryEntries/numbers/12345
...12345
はディレクトリ内で検索する電話番号です。存在する場合は、電話番号を持つ人の名前や住所などの情報を返します。
動画フォーマット変換サービスです。クライアントは、ビデオを 1 つの形式で送信します。
POST http://host/videos/
...そして、このビデオ用にサーバーによって生成された「ビデオ GUID」を受け取ります。クライアントは次にチェックします。
GET http://host/videos/[GUID]/flv
... 変換されたバージョンが存在する場合、FLV 形式に変換されたビデオを取得します。
上記の両方のケースで、チェック対象のリソースが存在しない場合に何が起こるかについて言及していないことに気付くでしょう。それが私の質問です。クライアントがリソースがここに存在するかどうかを確認するための適切な RESTful な方法は、リソースに対して(またはおそらく) を呼び出すことであり、リソースが存在しない場合は 404 応答を期待する必要があることを他のさまざまな 場所で読みました。404 応答が広く「エラー」と見なされていることを除けば、これで問題ありません。HTTP/1.1 仕様では、ステータス コードの 4xx クラスは、クライアントが「エラーを起こしたと思われる」場合を対象としていると規定されています。ちょっと待って; これらの例では、クライアントは確かに誤りを犯していません。期待している HEAD
GET
404 (または他のもの。このリソースへのアクセスが許可されていない場合は 403) が返される可能性があり、リソースの要求に間違いはありません。404 は「エラー状態」を示すことを意図したものではなく、単に「これは存在しません」という情報です。
また、ブラウザは、HTTP 仕様が示唆するように、404 応答が本物のエラーであるかのように動作します。Google Chrome と Firebug の両方のコンソールは、XHR リクエストによって 404 が受信されるたびに、エラー ハンドラによって処理されたかどうかに関係なく、大きな赤い「404 Not Found」エラー メッセージを Javascript コンソールに吐き出します。無効にする方法。ユーザーにはコンソールが表示されないため、これは問題ではありませんが、開発者として、JS コンソールで 404 (または 403 など) エラーが大量に表示されることは望ましくありません。それらはエラーではなく、私の Javascript コードによって処理されている情報です。ラインノイズです。私が示した 2 番目の例では、クライアントがサーバーをポーリングしている可能性が高いため、これは極端な回線ノイズです。/flv
コンパイルには時間がかかる場合があり、クライアントは非 404 になるまで「まだコンパイルされていません」と表示したいためです。JS コンソールに 1 ~ 2 秒ごとに 404 エラーが表示される場合があります。
では、これは REST でリソースの存在を確認するための最善または最も適切な方法でしょうか? JS コンソールの回線ノイズを回避するにはどうすればよいですか? 私の 2 番目の例では、次のように、別の URI をクエリしてコンパイルのステータスを確認することができます。
GET http://host/videos/[GUID]/compileStatus
...しかし、これはRESTの原則に少し違反しているようです。HTTP を完全に使用して HTTP ヘッダーに注意を払うのではなく、独自のプロトコルを作成して、代わりに知りたいことを伝える情報を本文に返し、常に HTTP 200 を返してブラウザーをシャットダウンします。 . これは、SOAP に対する大きな批判でした。SOAP は、HTTP を最大限に活用するのではなく、HTTP を「回避」しようとします。この原則により、なぜ 404 ステータス コードを返す必要があるのでしょうか? 常に 200 を返すことができます - もちろん、200 はリソースのステータス情報が利用可能であることを示しており、ステータス情報は本当に知りたかったことを示しています - リソースが見つからなかったということです。確かに、RESTful な方法は 404 ステータス コードを返すことです。
このメカニズムは、上記の最初の例に適用すると、さらに不自然に見えます。クライアントはおそらく次のようにクエリします:
GET http://host/directoryEntries/numberStatuses/12345
... そしてもちろん 200 を受け取ります。番号12345
のステータス情報が存在し、番号がディレクトリに見つからないことを示しています。これは、存在しない可能性がある場合でも、クエリされたすべての番号が「200 OK」になることを意味します。これは良い REST インターフェイスのように思えますか?
何か不足していますか?リソースが RESTful に存在するかどうかを判断するためのより良い方法はありますか、または HTTP を更新して、2xx 以外のステータス コードを必ずしも「エラー」と見なすべきではなく、単なる情報であることを示す必要がありますか? 2xx 以外のステータス応答を常に JS コンソールに「エラー」として出力しないようにブラウザを設定できるようにする必要がありますか?
PS。ここまで読んでくれてありがとう。;-)