使用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
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解析其他错误'
]);
}
控制器返回了数组,应该返回字符串或者response对象
报错就在“$response = $client->sendAsync($request)->wait();”,它返回了数组然后到了框架的http.php的encode方法,修改Guzzle那边response的类型?
接触webman 和guzzle都还不是很久,请指教
这句不会报错,return $response; 会报错,因为 $response 是数组,webman不支持返回数组,你可以转换为json组字符串,代码类似 return json($response);
好的,谢谢
我发现是这样的,其实跟Guzzle的post或sendAsync无关,跟返回的数据有关。以我的需求为例,我是向飞书服务端api请求数据:发送code请求accesstoken这样 一个接口。如果正常获取,飞书给我的是响应码200,guzzle能正常解析,如果响应码是400,guzzle就不能正常解析。 但是webman后台打印的日志是指向Http.php 188行,但这里打印echo是没用的,有点闷掉了
发现问题了。要对GuzzleHttp\Exception\RequestException;进行处理。 GuzzleHttp对响应码是400的当成异常了,就抛出了,之前还是用的webman框架的RequestException进行处理,没捕获到