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
相关产品推荐
相关产品推荐

