laravel GuzzleHttp Client 无法获取返回的错误信息

Client发送一些请求,当返回状态不是200的时候,无法获取完整错误信息

复制代码
$client = new Client([
            'base_uri' => $this->getUri().'/order/aaaaaa',
            'timeout' => 30,
            'verify' => false
        ]);
        try {
            $response = $client->request('POST', '', [
                'headers' => [
                    'Lang'=>'zh-CN',
                    'Authorization' => 'Bearer ' . $accessToken
                ],
                'json' =>[
                    'channelCode' => '',
                    'exportId' => '',
                ]
            ]);
            $response = $response->getBody()->getContents();
            return $this->success('登录成功', collect([]));
        } catch (GuzzleException $e) {
            dd($e->getResponse()->getBody()->getContents());
            return $this->error($e->getMessage(), collect([]));
        }

最后当捕获到异常的时候,会出现下面这种现象

复制代码
Client error: `POST http://192.168.11.1/api/order/aqedd` resulted in a `422 Unprocessable Content` response:
    {"success":false,"code":422,"locale":"zh-CN","message":"给定的数据不能为空","data":{"channelCode":["channel cod (truncated...)

可以看到,这并不是完整的报错信息,因为在最关键的代码排查处,出现了截取,截取的关键字就是truncated...,那么怎么获取到完整的信息呢

这样做

复制代码
dd($e->getResponse()->getBody()->getContents());

使用上面的代码就可以获取到完整报错信息

被截断的原始是Guzzle代码里做了限制,来看Exception源码,源码来自文件

复制代码
//.\vendor\guzzlehttp\guzzle\src\Exception\RequestException.php
public static function getResponseBodySummary(ResponseInterface $response)
    {
        $body = $response->getBody();

        if (!$body->isSeekable()) {
            return null;
        }

        $size = $body->getSize();

        if ($size === 0) {
            return null;
        }

        $summary = $body->read(120);
        $body->rewind();

        if ($size > 120) {
            $summary .= ' (truncated...)';
        }

        // Matches any printable character, including unicode characters:
        // letters, marks, numbers, punctuation, spacing, and separators.
        if (preg_match('/[^\pL\pM\pN\pP\pS\pZ\n\r\t]/', $summary)) {
            return null;
        }

        return $summary;
    }

所以当$size超过了120个字符之后,就会用(truncated...)截取,当然我们不希望去改动GuzzleHttp的核心代码,所以还是使用上面的方法来获取完整的异常信息吧。

相关推荐
楠木68513 小时前
从零实现一个 Vite 自动路由插件
前端
终端鹿13 小时前
Vue2 迁移 Vue3 避坑指南
前端·javascript·vue.js
进击的尘埃13 小时前
Signals 跨框架收敛:TC39 提案、Solid、Angular、Preact 的实现差异与调度策略对比
javascript
程序员陆业聪13 小时前
工程师的瓶颈,已经不是代码了
前端
毛骗导演13 小时前
@tencent-weixin/openclaw-weixin 源码ContextToken 持久化改造:实现微信自定义消息发送能力
前端·架构
爱丽_13 小时前
Pinia 状态管理:模块化、持久化与“权限联动”落地
java·前端·spring
进击的尘埃13 小时前
从多仓到 Monorepo 的渐进式迁移:Git 历史保留、依赖收敛与缓存调优
javascript
SuperEugene14 小时前
TypeScript+Vue 实战:告别 any 滥用,统一接口 / Props / 表单类型,实现类型安全|编码语法规范篇
开发语言·前端·javascript·vue.js·安全·typescript
我是永恒14 小时前
上架一个跨境工具导航网站
前端
电子羊14 小时前
Spec 编程工作流文档
前端