番号はアプリへの合図
ステータスコードは、HTTP レスポンスの最初の行にある3桁の番号で、リクエストの結果を知らせます。API が正しい番号を返すと、アプリは次にすることがわかります。
貸出アプリは、本が見つからないのか、入力の間違いなのか、サーバーの故障なのかで、利用者への言葉を変えます。番号の選び方と、エラーの伝え方を学びます。
このレッスンのゴール
メモ
結果に合うステータスコードを選び、エラーをわかりやすく伝えられる。
重要な言葉
| ことば | いみ | れい |
|---|---|---|
| 2xx | 成功を表す番号の仲間 | 200, 201, 204 |
| 4xx | 依頼した側の間違いを表す番号の仲間 | 400, 404 |
| 5xx | サーバー側の失敗を表す番号の仲間 | 500 |
| エラー本文 | 失敗の理由を伝える、レスポンスのボディ | |
| 競合 | 今の状態と食い違って、依頼ができないこと | 409 |
学生が入力するセルは、このプレビューでは空白です。
番号は百の位で読む
百の位の数字で、結果の仲間がわかります。2は成功、3は別の場所への案内、4は依頼した側の間違い、5はサーバー側の失敗です。
同じ4でも、400は依頼が正しくない、404は見つからない、409は今の状態と食い違う、という違いがあります。
例: よく使う番号
| 番号 | 意味 | 場面 |
|---|---|---|
| 200 | 成功。結果を返した | 本の一覧を読んだ |
| 201 | 成功。新しく作った | 本を足した |
| 204 | 成功。返す中身はない | 本を消した |
| 400 | 依頼が正しくない | 必須の項目がない |
| 404 | 見つからない | ない本を頼んだ |
| 409 | 今の状態と食い違う | 同じメールで登録した |
| 500 | サーバーの失敗 | プログラムが落ちた |
学生が入力するセルは、このプレビューでは空白です。
失敗の番号を、実際に出してみる
このラボで、会員の表を作り、4xx の番号を出します。メールアドレスは、会員ごとに1つだけです。
表は、同じメールを2回入れられない決まりを持っています。順番に Run して、最後の行の番号を読んでください。
psql にパスワードを渡す
export PGPASSWORD=shopここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
会員の表を作り直す
psql -h db -U shop -c "drop table if exists members; create table members (id serial primary key, email text unique not null, name text not null); insert into members (email, name) values ('[email protected]', 'Mori'); notify pgrst, 'reload schema'"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
新しい会員を登録する
curl -s -o /dev/null -w "%{http_code}\n" -X POST -H "Content-Type: application/json" -d '{"email":"[email protected]","name":"Sato"}' "http://api:3000/members"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
同じメールで、もう一度登録する
curl -s -w "\n%{http_code}\n" -X POST -H "Content-Type: application/json" -d '{"email":"[email protected]","name":"Sato"}' "http://api:3000/members"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
名前のない会員を登録する
curl -s -w "\n%{http_code}\n" -X POST -H "Content-Type: application/json" -d '{"email":"[email protected]"}' "http://api:3000/members"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
番号に文字を入れて探す
curl -s -w "\n%{http_code}\n" "http://api:3000/members?id=eq.abc"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
ない表を頼む
curl -s -o /dev/null -w "%{http_code}\n" "http://api:3000/loans"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
良いエラー本文は理由と直し方を伝える
番号だけでは、利用者は何をすればよいかわかりません。本文に、機械が読むコードと、人が読む説明と、直す項目を入れます。
説明には、サーバーの中身や、パスワード、ファイルの場所を入れません。外の人に見せてよい言葉だけにします。
練習: エラー本文を読む
import json
body = '{"code": "duplicate-email", "message": "このメールアドレスは登録済みです。", "field": "email"}'
error = json.loads(body)
print(error["code"])
print(error["message"])
print("直す項目:", error["field"])
# 練習: field が "name" で、message が名前を求める文のエラー本文を、自分で書きましょう。
よくある間違い
注意
エラーなら、とりあえず 500 を返せばよいと考えがちです。500 は、サーバー側の失敗を表します。利用者の入力が悪いときは 4xx を返します。そうすれば、入力を直せば通ることが、アプリに伝わります。