🍑
[PHP]APIとHTTPレスポンス(特に例外発生時に焦点)
概要
- 特に例外発生時、レスポンスヘッダ, ボディに内容をちゃんと設定したほうがよさそうだ、というお話
- 以下のサンプルコードでは、POSTした値のうち、keyがnameのvalueを返却する
コード
testAPI.php
<?php
try{
// POSTによる値の取得にはfile_get_contentsを使う
$json = file_get_contents("php://input");
// 第4引数: エラー発生時に、JSONExceptionとする設定
$contents = json_decode($json, true, 512, JSON_THROW_ON_ERROR);
}catch(JSONException $e){
// ステータスコードの設定
header("HTTP/1.1 400 Bad Request");
// Content-Typeの設定
header("Content-Type: application/json; charset=utf-8");
// レスポンスボディにエラーの詳細を記載
$result = array('code'=>400, 'message'=>'リクエストデータの形式が正しくありません','description'=>$e->getMessage());
echo json_encode($result, JSON_UNESCAPED_UNICODE);
exit;
}
// 正常時
header("HTTP/1.1 200 OK");
header("Content-Type: application/json; charset=utf-8");
echo json_encode(array('name' =>$contents['name']), JSON_UNESCAPED_UNICODE);
上記プログラム実行によるレスポンス
例外発生時
{
"code": 400,
"message": "リクエストデータの形式が正しくありません",
"description": "Syntax error"
}
このサンプルコードでは、例外発生時に
- code: ステータスコード(ヘッダで設定してるので、いらない気もするが)
- message: エラーメッセージ(という名の概要)
- description: エラー詳細(という名の$e->getMessageしたシステム的な内容)
を出力するようにしています。この辺の設計をしっかりしておくとよさそう。
正常時
リクエスト時のjsonで、nameをJohnに設定した場合
{
"name": "John"
}
ポイント
- レスポンスヘッダやボディの設定を明示的に行っている点
- 例外発生時、ステータスコードを返すだけでなく、レスポンスボディに詳細を書いてあげるとなおよさそう
Discussion