You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 8项目中如何处理Google API返回的500错误并自定义错误页

Laravel 8 处理Google PageSpeed API错误及自定义错误页方案

1. API请求逻辑改造:实现错误捕获

原生file_get_contents遇到HTTP错误时会直接抛出PHP警告,无法灵活捕获处理,推荐使用Laravel自带的HTTP客户端替代,内置完善的错误处理能力。
代码示例如下:

<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\Http;
use Illuminate\Http\Client\ConnectionException;

class ScreenshotController extends Controller
{
    public function getScreenshot($websiteURL)
    {
        try {
            // 发起GET请求,设置10秒超时
            $response = Http::timeout(10)->get("https://www.googleapis.com/pagespeedonline/v5/runPagespeed", [
                'url' => $websiteURL,
                'screenshot' => 'true'
            ]);

            if ($response->successful()) {
                $result = $response->json();
                // 使用data_get辅助函数安全读取多层嵌套字段,避免字段不存在时报错
                $screenshot1 = data_get($result, 'lighthouseResult.audits.final-screenshot.details.data');
                if (!$screenshot1) {
                    abort(400, '获取截图失败,目标网站无法正常访问');
                }
                // 后续正常业务逻辑
                return view('screenshot', compact('screenshot1'));
            } else {
                // 处理API返回的非200状态码,比如域名无效返回的500错误
                abort(400, '请求Google服务失败,请检查输入的域名是否有效');
            }
        } catch (ConnectionException $e) {
            // 捕获网络连接失败、DNS解析错误等底层问题
            abort(400, '网络连接异常,请稍后重试');
        } catch (\Exception $e) {
            // 兜底捕获所有未知错误
            abort(500, '服务暂不可用,请稍后重试');
        }
    }
}

2. 配置自定义错误页

Laravel 8会自动匹配resources/views/errors目录下与HTTP状态码同名的Blade模板作为错误页,配置步骤如下:

  • 若不存在对应目录,手动创建resources/views/errors文件夹
  • 在目录下创建对应状态码的模板文件,比如上文用到的400.blade.php、通用错误页500.blade.php
    示例模板代码:
<!-- resources/views/errors/400.blade.php -->
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>请求错误</title>
    <style>
        .error-container {
            max-width: 600px;
            margin: 100px auto;
            text-align: center;
        }
    </style>
</head>
<body>
    <div class="error-container">
        <h2>操作失败</h2>
        <p>{{ $exception->getMessage() }}</p>
        <a href="{{ url('/') }}">返回首页重新操作</a>
    </div>
</body>
</html>

3. 可选:全局异常处理优化

如果需要统一处理所有类型的错误,可修改app/Exceptions/Handler.php的render方法,自定义错误返回逻辑:

// app/Exceptions/Handler.php
public function render($request, Throwable $e)
{
    // 如果是AJAX/API请求,返回JSON格式错误
    if ($request->expectsJson()) {
        return response()->json([
            'code' => $e->getCode() ?: 500,
            'message' => $e->getMessage() ?: '服务异常'
        ], $e->getCode() >= 400 && $e->getCode() < 600 ? $e->getCode() : 500);
    }

    return parent::render($request, $e);
}

内容的提问来源于stack exchange,提问作者Emanuel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 11:48:04