質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

HTTPヘッダー

Hypertext Transfer Protocol(HTTP)の中のHTTPヘッダフィールドはHTTPの要求やレスポンスの機能しているパラメーターが含まれます。その要求もしくはレスポンスライン(メッセージの最初の一行)でメッセージヘッダを作ります。

Q&A

解決済

3回答

15797閲覧

PUT,DELETE等のHTTPメソッドに対応していないリソースが返すべきレスポンスとは?

sounisi5011

総合スコア697

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

HTTPヘッダー

Hypertext Transfer Protocol(HTTP)の中のHTTPヘッダフィールドはHTTPの要求やレスポンスの機能しているパラメーターが含まれます。その要求もしくはレスポンスライン(メッセージの最初の一行)でメッセージヘッダを作ります。

0グッド

1クリップ

投稿2015/04/23 17:46

HTTPメソッドで、PUTやDELETE等に対応していないリソースが返すべきレスポンス(ステータスコード)とは?

今まで、PUTやDELETEなどのHTTPメソッドによる処理に対応していない/許可されていないリソースは、405 Method Not Allowedを返すものと考えていました。

ところが、以下のページでは、404 Not Foundを返すという例示が書いてあります。

HTTP Methods for RESTful Services

また、405 Method Not Allowedについて調べた所、HTTPメソッドを許可していないという意味が正しいとのこと。

[対処法] 405 Method Not Allowed

正しくは「送信されたメソッドは許可していない」という意味で、「実装していない」という意味ではない。ウェブサーバ側ではこのメソッドによるリクエストを処理する実装がなされているが、何らかの理由により許可していない場合に利用するのが正しいが、区別していない場合もあるので注意が必要。


例えば、特定のユーザのみが更新/削除できるリソースの場合は、許可されていないリクエストのため405 Method Not Allowedが適切と考えられます。
しかし、該当のリソースが対応していない(GET,HEADによる取得のみ可能な)場合、404 Not Foundを返すべきなのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

自己解決

RFC 2616の5.1.1 Method及びRFC 7231の4.1. Overviewに、これに関する記述が存在しました。
以下、それぞれの日本語版より引用します。

http://www.spencernetwork.org/reference/rfc2616-ja-HTTP1.1.txt

オリジンサーバは、メソッドを理解できても要求されたリソースに対して許されていない場合は、ステータスコード 405 (Method Not Allowed) を返す べきであり、またオリジンサーバがそのメソッドを認識できなかったり実装されていない場合には 501 (Not Implemented) を返す べきである

RFC 7231 — HTTP/1.1: Semantics and Content (日本語訳)

生成元サーバは:

  • 自身が認識できない/実装していない 要請メソッドを受信したときは、 501 (Not Implemented)で応答するべきである。
  • 自身に既知であるが,ターゲットリソースには許容されない 要請メソッドを受信したときは、 405 (Method Not Allowed)で応答するべきである。

【2015/09/13追記】

ただし、この501 Not Implementedはサーバそのものが対応していない場合に用いるレスポンスコードのようです。

HTTP response codes - HTTP | MDN

501 Not Implemented リクエストメソッドがサーバでサポートされておらず、扱えないことを示します。サーバがサポートしなければならない (従って、このコードを返してはならない) メソッドは GET と HEAD だけです。

[対処法]501 Not Implemented

GET
もっとも利用されることが多いメソッド。URIで指定したリソースを返す。HTTP1.1ではGETメソッドのサポートが必須となっているため、このメソッドでのリクエストで501エラーが発生することは考えられない。

HTTPステータス・コードとメソッド - CyberLibrarian

501 Not Implemented 未実装 1.0
サーバーは、リクエストを実行するために必要な機能をサポートしていない。

http://www.spencernetwork.org/reference/rfc2616-ja-HTTP1.1.txt

10.5.2 501 Not Implemented

サーバは、リクエストを実行するのに必要な機能をサポートしていない。こ
れは、サーバがリクエストメソッドを認識できない時の適切なレスポンスで
あり、どんなリソースに対してもそれをサポートする能力がない。

RFC 7231 — HTTP/1.1: Semantics and Content (日本語訳)

状態°コード 501 (Not Implemented)は、[ サーバが,要請を履行するために要求される機能性をサポートしない ]ことを指示する。 これは、[ サーバが要請メソッドを認識せず,[ どのリソースも それをサポートする能力を備えていない ]]ときに適切な応答になる。

上記より、501 Not Implementedはサーバレベルで認識できない/実装していない(=どのリソースでもサポートしていない)メソッドの場合に返すべきであり、
Web APIなど、サーバが対応しているがアプリケーションが対応していない場合は、「要求されたリソースに対して許されていない場合」(アプリケーションが該当メソッドを許容しない)であるとして405 Method Not Allowedを利用するべきであると考えられます。

Web APIなどであれば、POSTメソッドのみに対応するリソースというものも設計できます。
しかし仕様により、GET/HEADメソッドでは501 Not Implementedを返してはならないので、リソースが対応していない場合は405 Method Not Allowedとするべきでしょう。

投稿2015/04/24 06:35

編集2015/09/13 12:11
sounisi5011

総合スコア697

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chokojori

2015/04/24 08:22

このRFCに従うなら、以下はillegalってことになりますかね。 http://www.restapitutorial.com/lessons/httpmethods.html つまり、そのリソースに対して受け付けていないメソッドの場合に404 (Not Found) を返していますが、これはsounisi5011さんの紹介しているRFCには適合しません。
sounisi5011

2015/09/13 12:13 編集

調べたところ解決できたため、このコメントは無視して下さい。 --- 501 Not Implementedを出力する条件である「自身が認識できない/実装していない」の判断基準について迷いがあります。 例えばPHPでGETメソッドのみを受け付けるページを作った場合、PHP本体及びPHPの実行サーバではGET以外のメソッド(POSTなど)が「実装されており」、「認識して」PHPで処理できます。 しかしPHPのプログラムコードレベルでは、GETメソッドのみを受け付けるよう設計しているため他のメソッドは「実装されておらず」、「認識もしません」。 サーバレベルでは実装されているが、アプリケーションレベルでは実装されていない。 このような場合、501と405のどちらなのか?
guest

0

ご指摘の例に従う方針であれば、その通りかと思います。
そして、その方針で良いんじゃないかな、と私は思います。

HTTPのメソッドとステータスコードの対応についてはRFCによってガイドラインが示されているだけで、必ずこうしなければならない、と決まっているわけではないと思います。(そもそも、RFCに違反する実装をしたからと言って、即座に問題になるわけではない。)

RESTfulなWebサービスというアイデア自体、ひとつのスタイルでありますし、現状は色々な実装が「試行錯誤」的に立ち上がっている状況だと思います。このあたりのことが、ある種の慣例として定着したなら、そのときはRESTfulなWebサービスを実装するためのフレームワーク/ミドルウェアもまた定着し、細かいRFCのことなど誰も意識せずに実装できるようになっていると思います。

投稿2015/04/23 22:35

chokojori

総合スコア971

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

これは自分も知りたいです。
自分の作ったAPIでは、PUTやDELETEなどのHTTPメソッドによる処理に対応していない/許可されていないリソースは405 Method Not Allowedを返し、特定のユーザのみが更新/削除できるリソースの場合は403 Forbiddenを返してました。

確かに404 Not Foundを返すサービスも多いので、どちらがより適切なのか知りたいです。

回答になっていなくてすみません。

投稿2015/04/23 23:37

naga3

総合スコア1293

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問