RESTful API リクエストを処理する際、ユーザーのリクエストにエラーがある場合や、サーバーで予期しない事態が発生した場合は、例外をスローしてユーザーに何か問題が発生したことを通知するだけで済む場合があります。エラーの原因(例えば、要求されたリソースが存在しないなど)を特定できる場合は、適切な HTTP ステータスコードとともに例外をスローすることを検討する必要があります(例えば、yii\web\NotFoundHttpException は 404 ステータスコードを表します)。Yii は、対応する HTTP ステータスコードとテキストとともにレスポンスを送信します。また、Yii は、レスポンスボディに例外のシリアライズされた表現を含めます。例:
HTTP/1.1 404 Not Found
Date: Sun, 02 Mar 2014 05:31:43 GMT
Server: Apache/2.2.26 (Unix) DAV/2 PHP/5.4.20 mod_ssl/2.2.26 OpenSSL/0.9.8y
Transfer-Encoding: chunked
Content-Type: application/json; charset=UTF-8
{
"name": "Not Found Exception",
"message": "The requested resource was not found.",
"code": 0,
"status": 404
}
次のリストは、Yii REST フレームワークで使用される HTTP ステータスコードをまとめたものです。
200
: OK。すべてが期待どおりに機能しました。201
: POST
リクエストに応じてリソースが正常に作成されました。Location
ヘッダーには、新しく作成されたリソースを指す URL が含まれています。204
: リクエストは正常に処理され、レスポンスには(DELETE
リクエストのように)ボディコンテンツが含まれていません。304
: リソースが変更されていません。キャッシュされたバージョンを使用できます。400
: 不正なリクエスト。これは、リクエストボディに無効な JSON データを提供したり、無効なアクションパラメータを提供したりするなど、ユーザーによるさまざまなアクションが原因である可能性があります。401
: 認証に失敗しました。403
: 認証されたユーザーは、指定された API エンドポイントにアクセスすることが許可されていません。404
: 要求されたリソースが存在しません。405
: メソッドが許可されていません。許可されている HTTP メソッドについては、Allow
ヘッダーを確認してください。415
: サポートされていないメディアタイプ。要求されたコンテンツタイプまたはバージョン番号が無効です。422
: データ検証に失敗しました(例えば、POST
リクエストへの応答の場合)。詳細なエラーメッセージについては、レスポンスボディを確認してください。429
: リクエストが多すぎます。リクエストはレート制限のために拒否されました。500
: 内部サーバーエラー。これは、内部プログラムエラーが原因である可能性があります。デフォルトのエラーレスポンス形式をカスタマイズしたい場合があります。例えば、異なるエラーを示すために異なるHTTPステータスを使用する代わりに、常にHTTPステータスとして200を使用し、レスポンスのJSON構造の一部として実際のHTTPステータスコードを囲みたい場合があります。以下に示すように。
HTTP/1.1 200 OK
Date: Sun, 02 Mar 2014 05:31:43 GMT
Server: Apache/2.2.26 (Unix) DAV/2 PHP/5.4.20 mod_ssl/2.2.26 OpenSSL/0.9.8y
Transfer-Encoding: chunked
Content-Type: application/json; charset=UTF-8
{
"success": false,
"data": {
"name": "Not Found Exception",
"message": "The requested resource was not found.",
"code": 0,
"status": 404
}
}
この目標を達成するには、アプリケーション設定のresponse
コンポーネントのbeforeSend
イベントに応答できます。
return [
// ...
'components' => [
'response' => [
'class' => 'yii\web\Response',
'on beforeSend' => function ($event) {
$response = $event->sender;
if ($response->data !== null && Yii::$app->request->get('suppress_response_code')) {
$response->data = [
'success' => $response->isSuccessful,
'data' => $response->data,
];
$response->statusCode = 200;
}
},
],
],
];
上記のコードは、suppress_response_code
がGET
パラメータとして渡された場合に説明したように、レスポンス(成功したレスポンスと失敗したレスポンスの両方)を再フォーマットします。
タイプミスを見つけたり、このページを改善する必要があると思われますか?
githubで編集する !
コメントするにはサインアップまたはログインしてください。