こんにちは!ネットワークとWebの深淵を愛するインフラエンジニアです。
今日は、Web API開発や運用で誰もが一度は遭遇する「ちょっとした壁」、HTTPステータスコード 405 Method Not Allowed についてお話ししましょう。
「せっかくAPIを作ったのに、なぜかエラーが返ってくる…」そんなとき、画面に 405 という数字が出てきたら、ネットワークの世界では一体何が起きているのでしょうか?難しく考えず、身近な郵便配達の例えから紐解いていきましょう。
—
1. 405エラーとは何か?郵便配達で例えてみる
インターネット上でのやり取りは、現実世界の郵便とよく似ています。
あなたが誰かに手紙(リクエスト)を送るとき、郵便局員(Webサーバー)はあなたの手紙を受け取り、宛先(エンドポイント)へ届けますよね。ここで重要なのが「手紙の種類」です。
- GET(読む): 相手の近況報告を読み取る。
- POST(送る): 新しいプレゼントを送る。
- DELETE(消す): 不要な書類を破棄してもらう。
ここで想像してみてください。あなたは「大切な書類を破棄してほしい」という手紙を送りました。しかし、届いた先の相手が「この部署は書類を受け取ることはできるけど、破棄する権限は持っていないんだ」と言ったらどうなるでしょう?
そう、「その手紙(メソッド)はここでは受け付けられないよ!」 と突き返されます。これが 405 Method Not Allowed の正体です。
技術的に言えば、「指定されたURL(リソース)に対して、そのHTTPメソッドを使うことは許可されていませんよ」 というサーバーからの丁寧な(しかし冷徹な)お断りなのです。
—
2. なぜ405エラーが起きるのか?
このエラーが発生する主な理由は、大きく分けて2つあります。
① 単純な「指示の出し間違い」
例えば、本来は情報を取得する GET でアクセスすべきページに対して、誤って情報を送信する POST でリクエストを送ってしまった場合です。サーバー側の設定で「このURLはデータ取得専用です!」と決まっていれば、当然エラーになります。
② サーバー側の「看板の掲げ忘れ」
WebサーバーやAPIフレームワークには、「どのURLで、どのメソッドを許可するか」という設定ファイルがあります。開発者がコードを書く際に、つい「このメソッドを許可する」という設定を忘れてしまうと、サーバーは「そんな動き方は知りません!」と拒絶してしまいます。
—
3. 実践!コードで見る405の発生原因
実際にWebアプリケーション(今回はPythonのFlaskを例にします)で、どういう時にこのエラーが起きるか見てみましょう。
from flask import Flask
app = Flask(__name__)
# 特定のURLに対してGETのみを許可する設定
@app.route('/user', methods=['GET'])
def get_user():
return "ユーザー情報を取得します"
# もしここで、クライアントが POST でアクセスしてくると…
# Flaskは自動的に 405 Method Not Allowed を返します。
このように、methods=['GET'] と明示的に指定している場合、それ以外の POST や DELETE などでアクセスすると、Webサーバーは律儀に 405 を返してくれる仕組みになっています。
—
4. 解決へのステップ:トラブルシューティング
もしあなたが開発中に 405 に遭遇したら、以下の手順でチェックしてみてください。
1. 送ったメソッドは正しいか確認する
- ブラウザでURLを叩くとデフォルトで
GETになります。もしそのAPIがPOST専用なら、ブラウザのアドレスバーに打ち込むだけではエラーになります。curlコマンドなどを使ってテストしましょう。 curl -X POST http://example.com/api/resource
2. サーバーのルーティング設定を確認する
- コード内で「許可するメソッド」のリストに、今使おうとしているメソッドが含まれているか再確認しましょう。
3. Allowヘッダーをチェックする
- サーバーは親切にも「何ならできるのか」を
Allowというヘッダーで教えてくれています。ネットワークのデバッグツール(Chromeの検証ツールなど)でレスポンスヘッダーを見てみてください。 Allow: GET, HEADのように書かれていれば、「お、ここはGETしかできないんだな」と一発でわかります。
—
最後に:エラーは「道しるべ」
405 Method Not Allowed は、決して「何をやってもダメ」という意味ではありません。「やり方が間違っているから、正しい手順でやり直してね」 という、サーバーからの明確なヒントです。
ネットワークプロトコルは、こうした一つひとつのやり取りの積み重ねです。エラーが出たら「うわっ!」と焦るのではなく、「なるほど、サーバーは今、こういうルールで運用されているんだな」と一歩引いて観察してみてください。
そうやってパケットの会話に耳を傾けることが、最強のインフラエンジニアへの第一歩ですよ!
それでは、また次回の深淵でお会いしましょう。ハッピー・コーディング!
コメント