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

相关推荐
27669582928 分钟前
dy bd-ticket-guard-client-data bd-ticket-guard-ree-public-key 逆向
前端·javascript·python·abogus·bd-ticket·mstoken·ticket-guard
m0_7263658318 分钟前
哈希分分预测系统 + Python Worker + Web 仪表盘”小系统(PHP + MySQL)
前端·python·哈希算法
WX-bisheyuange20 分钟前
基于SpringBoot的交通管理在线服务系统
前端·javascript·vue.js·毕业设计
WHOVENLY34 分钟前
揭秘正则表达式的基础语法与应用
开发语言·javascript·正则表达式
Coder_Boy_1 小时前
基于SpringAI的在线考试系统-考试系统DDD(领域驱动设计)实现步骤详解(2)
java·前端·数据库·人工智能·spring boot
GIS之路1 小时前
ArcGIS Pro 实现影像波段合成
前端·python·信息可视化
m0_748254661 小时前
CSS id 和 classid 和 class 选择器
前端·css
光算科技1 小时前
单页应用SEO可行性丨Angular项目的3个索引优化方案
前端·javascript·angular.js
ggaofeng1 小时前
实践NPM打包和使用
前端·npm·node.js
一只小bit2 小时前
Qt MainWindow:主窗口组件的介绍与正确使用
前端·c++·qt