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

相关推荐
七七powerful几秒前
mac电脑安装cmca根证书
java·前端·macos
invicinble2 分钟前
前端框架使用vue-cli (第五层:构建打包层--vue.config.js文件介绍以及环境文件)
javascript·vue.js·前端框架
神探小白牙2 分钟前
echarts环形图自定义
android·前端·echarts
故事和你914 分钟前
洛谷-数据结构2-1-二叉堆与树状数组2
开发语言·javascript·数据结构·算法·ecmascript·动态规划·图论
ZC跨境爬虫6 分钟前
跟着 MDN 学 HTML day_28:(使用选择器 API 在 DOM 树中进行选择与遍历)
前端·ui·html·音视频·webrtc
东北甜妹7 分钟前
K8s Ingress
java·运维·前端
RickyWasYoung7 分钟前
【Matlab】合并多个子图的fig文件为一个大图
前端·matlab·信息可视化
爱滑雪的码农8 分钟前
React+three.js之项目搭建
前端·javascript·react.js
张风捷特烈10 分钟前
状态管理大乱斗#07 | Signals 源码评析 - 暗流涌动
android·前端·flutter
接着奏乐接着舞2 小时前
sse 两种调用方式
前端·javascript·vue.js