LaravelのAPIレスポンスエラーをJSONで取得する方法

Published:

API利用時にエラーをJSONで貰いたいとき、検索するとapp/Exceptions/handler.phpを編集するという内容が良く出てきます。 しかし、そのようなことをしなくてもLaravelはリクエスト時に Acceptヘッダーに application/json を指定すれば、自動的にJSONになります。 debugが有効であればabortヘルパやトレース情報もJSONになります。

fetch時のヘッダ設定例

headers: {
    'Accept': 'application/json',
    'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8',
    'X-CSRF-TOKEN': csrf,
}

バリデーションエラーのレスポンス例

422 Unprocessable Entity

{
    "message": "The given data was invalid.",
    "errors": {
        "image": [
            "imageは、必ず指定してください。"
        ]
    }
}

abortヘルパのレスポンス例

{
    "message": "テストエラー",
    "exception": "Symfony\\Component\\HttpKernel\\Exception\\HttpException",
    "file": "/home/vagrant/test/vendor/laravel/framework/src/Illuminate/Foundation/Application.php",
    "line": 940,
    "trace": [
        {
            "file": "/home/vagrant/test/vendor/laravel/framework/src/Illuminate/Foundation/helpers.php",
            "line": 35,
            "function": "abort",
            "class": "Illuminate\\Foundation\\Application",
            "type": "->"
        },
        {
            "file": "/home/vagrant/test/app/Http/Controllers/API/TestController.php",
            "line": 36,
            "function": "abort"
        },
        (省略)
    ]
}

debugがfalseの時は message だけになる。