使用guzzle进行sendAsync请求,报错Error:Array to string

达达尼黑

问题描述

使用post方法是OK的,使用sendAsync就报错
PS:看上去是不是Guzzle的返回在webman框架的http类中解析有问题?

程序代码

post方法的代码

$client = new Client();
$response = $client->post($url, [
'headers' => [
'Content-Type' => 'application/json;charset=utf-8',
],
'json' => [
'grant_type' => 'authorization_code',
'client_id' => $this->config['app_Id'],
'client_secret' => $this->config['app_Scrt'],
'code' => $params['code']
],
]);

sendAsync方法

$headers = [
'Content-Type' => 'application/json;charset=utf-8'
];
$body = json_encode([
'grant_type' => 'authorization_code',
'client_id' => $this->config['app_Id'],
'client_secret' => $this->config['app_Scrt'],
'code' => $params['code']
]);
$request = new \GuzzleHttp\Psr7\Request('POST', $url, $headers, $body);
// $data = null;
$response = $client->sendAsync($request)->wait();

报错信息

ErrorException: Array to string conversion in /***/vendor/workerman/workerman/src/Protocols/Http.php:188
Stack trace:
#0 /***/vendor/workerman/workerman/src/Protocols/Http.php(188): {closure}(2, 'Array to string...', '/data/html/cfcs...', 188)
#1 /***/vendor/workerman/workerman/src/Connection/TcpConnection.php(426): Workerman\Protocols\Http::encode(Array, Object(Workerman\Connection\TcpConnection))
#2 /***/vendor/workerman/webman-framework/src/App.php(747): Workerman\Connection\TcpConnection->send(Array)
#3 /***/vendor/workerman/webman-framework/src/App.php(662): Webman\App::send(Object(Workerman\Connection\TcpConnection), Array, Object(support\Request))
#4 /***/vendor/workerman/webman-framework/src/App.php(156): Webman\App::findRoute(Object(Workerman\Connection\TcpConnection), '/Api/getFXUserA...', 'POST/Api/getFXU...', Object(support\Request), 200)
#5 /***/vendor/workerman/workerman/src/Connection/TcpConnection.php(748): Webman\App->onMessage(Object(Workerman\Connection\TcpConnection), Object(support\Request))
......
worker[webman:7306] exit with status 64000

截图报错信息里报错文件相关代码

操作系统及workerman/webman等框架组件具体版本

Linux ec54b45102ad 6.1.21-v8+
"workerman/webman-framework": "^1.6.8"

已解决

1.原因:
飞书对于code非0(code为0,表示数据请求正常,并且响应码为200)响应码为40x 50x,
导致Guzzle抛出异常,只能在GuzzleRequestExecption中进行处理,使用系统自带的RequestException是捕获不到的
2.处理:

        ......
        } catch (RequestException $e) {
            // 处理 Guzzle 请求异常
            if ($e->hasResponse()) {
                $response = $e->getResponse();
                $statusCode = $response->getStatusCode();

                // 检查响应码
                if ($statusCode === 400) {
                    // 解析400的响应
                    $errorData = json_decode($response->getBody(), true);
                    // 处理错误数据
                    return json([
                        'code' => 60006,
                        'msg' => '响应码' . $statusCode . ':'. $errorData['error'] . ':' . $errorData['error_description']
                    ]);
                }
            } else {
                // 处理其他异常
                return json([
                    'code' => 60007,
                    'msg' => '飞书响应与GClient解析其他错误'
                ]);
            }
204 1 0
1个回答

walkor 打赏

控制器返回了数组,应该返回字符串或者response对象

  • 达达尼黑 12天前

    报错就在“$response = $client->sendAsync($request)->wait();”,它返回了数组然后到了框架的http.php的encode方法,修改Guzzle那边response的类型?
    接触webman 和guzzle都还不是很久,请指教

  • walkor 12天前

    这句不会报错,return $response; 会报错,因为 $response 是数组,webman不支持返回数组,你可以转换为json组字符串,代码类似 return json($response);

  • 达达尼黑 12天前

    好的,谢谢

  • 达达尼黑 11天前

    我发现是这样的,其实跟Guzzle的post或sendAsync无关,跟返回的数据有关。以我的需求为例,我是向飞书服务端api请求数据:发送code请求accesstoken这样 一个接口。如果正常获取,飞书给我的是响应码200,guzzle能正常解析,如果响应码是400,guzzle就不能正常解析。 但是webman后台打印的日志是指向Http.php 188行,但这里打印echo是没用的,有点闷掉了

  • 达达尼黑 11天前

    发现问题了。要对GuzzleHttp\Exception\RequestException;进行处理。 GuzzleHttp对响应码是400的当成异常了,就抛出了,之前还是用的webman框架的RequestException进行处理,没捕获到

×
🔝