🍑

[PHP]APIとHTTPレスポンス(特に例外発生時に焦点)

2022/03/03に公開

概要

  • 特に例外発生時、レスポンスヘッダ, ボディに内容をちゃんと設定したほうがよさそうだ、というお話
  • 以下のサンプルコードでは、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