CakePHP API使用時、404エラーの際に処理を止めないようにする
CakePHP API使用時、404エラーの際に処理を止めないようにする
- CakePHP 3.9
- PHP 7.1、7.4.19で確認
- Zoom API
要約すると
"http_errors" => false, を追加
受け取り側で必要なデータがあるか、ステータスコードはどうかをチェック
必要に応じてエラー表示
エラー発生
Zoom API(https://marketplace.zoom.us/docs/api-reference/zoom-api/methods#operation/dashboardMeetingParticipants)を使用して、現在開催中のミーティングの参加者一覧を取得、DBに保存されているユーザーデータと照合し、誰が参加しているのかを表示するページを作成しているとき、問題が発生しました。
確認しようとしたMeeting ID(調べたいミーティングの番号)が現在開催されている場合は問題なく表示されていました。
しかし、その会議が終了した途端、404エラーページが表示されてしまいました。
原因追求
会議が終了したとき、または過去のMeeting IDを使用したときのみのエラーなので、APIがらみでの原因と推測しました。
ZoomAPIからのResponsesをよく確認してみると、
-404 HTTP Status Code: 404
Error Code: 3001
Meeting ID is invalid or has not ended.
と書いてありました。どうやらこれが原因のようです。
修正(失敗)
APIへのリクエストは下記のようにして取得しています。
$client = new Client($client_params);
$jwt_token = $this->createJwtTokenM();
$response = $client->request(
$method,
$path,
[
'headers' => [
'Content-Type' => 'application/json',
'Authorization' => 'Bearer ' . $jwt_token,
],
]
);
$result_json = $response->getBody()->getContents();
$result = json_decode($result_json, true);
return $result;
404で返ってくるのが原因なら、ステータスコードを確認して404だった場合の分岐をかければいいのかなと推測。
getContents()
をする前に getStatusCode()
でステータスコードの取得、そこで分岐して404の場合は空配列を返すように修正してみました。
しかし、それでも404エラーが表示されてしまいます。
どの時点で404エラーページが出力されているか確認してみたところ、$client->request()
の時点で404エラーページが出力されてしまっていました。
ここで表示されてしまうと打つ手がないと思い、先人たちの知恵を借りることに。
参考 : https://qiita.com/yousan/items/2a4d9eac82c77be8ba8b
404のときは$client->request() の時点で例外が投げられていました。
確かに冷静になってコードを確認してみたら、request()のphpDocsに @throws GuzzleException
の文字がありました。
修正(成功)
上記参照先にもあるように、対応方法は2つあります。
- http_errorsをfalseにする
- 例外を catch する
今回の場合、上記コードの部分を汎用的に使用してしまっているため、1番目の方法を採用しました。
これにより、404が返ってきたとしても例外を投げないため、コードが中断されません。
$client = new Client($client_params);
$jwt_token = $this->createJwtTokenM();
$response = $client->request(
$method,
$path,
[
'headers' => [
'Content-Type' => 'application/json',
'Authorization' => 'Bearer ' . $jwt_token,
],
"http_errors" => false,
]
);
$result_json = $response->getBody()->getContents();
$result = json_decode($result_json, true);
return $result;
赤字の部分の追加だけで、エラーページは表示されなくなりました。
*これだけだと実際にエラーが起きた場合に理由がわからなくなってしまうので、getStatusCodeやbodyの中身チェックなどでエラー原因を特定することが必要です。
getStatusCodeで404が取得できるため、その場合のエラー処理を行うことができるようになります。
大変だったところ
検索してもあまり参考になる情報が出てこず、解決方法を見つけるのに時間が掛かってしまいました。みんなが知っている事なのかもしれません。
終わりに
経験が少ないだけかもしれませんが、今まで使用してきたAPIは、存在するデータがない場合には{"error" => "〇〇○"}と返ってくるだけで、Status Codeが変更されることがありませんでした。 比較的多いようです。今後気を付けます。
このようなresponseの形があることがわかり、とても勉強になりました。
また、自動生成してくれるphpDocsにも throw GuzzleException って書いてあったのに、対策できていなかったことが問題でした。
今後、ほかのAPIを使用する機会もたくさんあると思うので、今回のようなこともある、ということを頭に置いて勉強していきたいです。
プログラマー/A.A