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的核心代码,所以还是使用上面的方法来获取完整的异常信息吧。

相关推荐
攀登的牵牛花1 分钟前
前端向架构突围系列 - 状态数据设计 [8 - 4]:有限状态机 (FSM) 在复杂前端逻辑中的应用
前端
Lsx_1 分钟前
前端视角下认识 AI Agent 和 LangChain
前端·人工智能·agent
陈振wx:zchen200827 分钟前
JavaScript
javascript·js
我是伪码农35 分钟前
Vue 智慧商城项目
前端·javascript·vue.js
不认输的西瓜38 分钟前
fetch-event-source源码解读
前端·javascript
用户390513321928840 分钟前
前端性能杀手竟然不是JS?图片优化才是绝大多数人忽略的"降本增效"方案
前端
朱昆鹏1 小时前
开源 Claude Code + Codex + 面板 的未来vibecoding平台
前端·后端·github
lyrieek1 小时前
pgadmin的导出图实现,还在搞先美容后拍照再恢复?
前端
永远是我的最爱2 小时前
基于.NET的小小便利店前台收银系统
前端·sqlserver·.net·visual studio
从文处安2 小时前
「九九八十一难」第一难:前端数据mock指南(TS + VUE)
前端