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

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

ただいまの
回答率

90.50%

  • HTTP

    557questions

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

  • HTTPヘッダー

    91questions

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

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

解決済

回答 3

投稿

  • 評価
  • クリップ 1
  • VIEW 6,603

sounisi5011

score 699

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を返すべきなのでしょうか?
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

check解決した方法

+2

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 17:22

    このRFCに従うなら、以下はillegalってことになりますかね。

    http://www.restapitutorial.com/lessons/httpmethods.html

    つまり、そのリソースに対して受け付けていないメソッドの場合に404 (Not Found) を返していますが、これはsounisi5011さんの紹介しているRFCには適合しません。

    キャンセル

  • 2015/09/13 20:43 編集

    調べたところ解決できたため、このコメントは無視して下さい。

    ---

    501 Not Implementedを出力する条件である「自身が認識できない/実装していない」の判断基準について迷いがあります。

    例えばPHPでGETメソッドのみを受け付けるページを作った場合、PHP本体及びPHPの実行サーバではGET以外のメソッド(POSTなど)が「実装されており」、「認識して」PHPで処理できます。
    しかしPHPのプログラムコードレベルでは、GETメソッドのみを受け付けるよう設計しているため他のメソッドは「実装されておらず」、「認識もしません」。

    サーバレベルでは実装されているが、アプリケーションレベルでは実装されていない。
    このような場合、501と405のどちらなのか?

    キャンセル

+1

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • HTTP

    557questions

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

  • HTTPヘッダー

    91questions

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