

YouTubeAPIを使って情報を得ようとしています。エラー処理を書いているところですが、メッセージの取得がうまくいきません。

[code]

    try {
    　　　　// 略
    } catch (\Exception $e) {
        // Log::error('YouTube API request failed: ' . $e->getMessage());
        // "error": {
        //   "code": 403,
        //   "message": "The request cannot be completed because you have exceeded your \u003ca h (truncated...)
        $errorLogFile = storage_path('logs/error_response.log');
        file_put_contents($errorLogFile, $e->);
    }
    
[/code]

$e->getMessageにすると次のような結果になります。

[code]

    {
      "error": {
        "code": 400,
        "message": "API key not valid. Please pass a valid API key.",
        "errors": [
           (truncated...)
    
[/code]

不完全なJson形式になっており、messageを取り出すには正規表現が必要な状態

そこで、エラーが発生したURLを直接叩いてみると、ちゃんと完全なjson形式になっていました。

[code]

    {
      "error": {
        "code": 400,
        "message": "API key not valid. Please pass a valid API key.",
        "errors": [
          {
            "message": "API key not valid. Please pass a valid API key.",
            "domain": "global",
            "reason": "badRequest"
          }
        ],
        "status": "INVALID_ARGUMENT",
        "details": [
          {
            "@type": "type.googleapis.com/google.rpc.ErrorInfo",
            "reason": "API_KEY_INVALID",
            "domain": "googleapis.com",
            "metadata": {
              "service": "youtube.googleapis.com"
            }
          }
        ]
      }
    }
    
[/code]

ここで $e で受け取った情報から、どうやって先程の完全なレスポンスを受け取ることができるのでしょうか？  
$eのメソッドとして、
`getFile`,`getCode`,`getMessage`,`getLine`,`getTrace`などがありますが、レスポンスそのものを取り出すものがないように思えます。

なにか私の勘違いがあるのかしれませんが、APIのレスポンスをそのまま受け取るにはどうすればよいのか教えてください。

よろしくお願いします。


CC BY-SA 4.0
2023-05-05T03:07:22.757
94745
2023-05-05T05:30:30.463
2023-05-05T04:36:50.027
3060
7980
question
laravel youtube-data-api
Laravel10 で API エラーで catch した際に レスポンスを取得する方法を教えてください


最終的に次の方法で実現しました。もっと簡単な方法がある気がします…  
（エラー処理部分を切り出したので、コードが異なります）

  1. `RequestException $e` で受け取る
  2. `$responseBody = $response->getBody()->getContents();` でレスポンス取り出し
  3. `$errorData = json_decode($responseBody, true);` json形式を配列に変換

[code]

        private function handleApiError(RequestException $e): array
        {
            $response = $e->getResponse();
    
            if ($response !== null) {
                // レスポンス本体を取得
                $responseBody = $response->getBody()->getContents();
                // JSONデコード
                $errorData = json_decode($responseBody, true);
    
                if ($errorData !== null) {
                    $error = $errorData['error'];
                    $result = [
                        'code' => $error['code'],
                        'message' => $error['message'],
                    ];
                } else {
                    $result = [
                        'code' => '000',
                        'message' => "Error message not found or not a valid JSON string",
                    ];
                }
            } else {
                Log::error("No response available");
            }
            $result['status'] = 'error';
            return $result;
        }
    
[/code]


CC BY-SA 4.0
2023-05-05T05:30:30.463
94746
2023-05-05T05:30:30.463
7980
94745
answer