" /> ">

コムセント 技術情報

  1. TOP
  2. コムセント 技術情報
  3. CakePHP API使用時、404エラーの際に処理を止めないようにする

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

このメンバーの記事一覧へ

おすすめ記事