使用post方法是OK的,使用sendAsync就報(bào)錯(cuò)
PS:看上去是不是Guzzle的返回在webman框架的http類中解析有問(wèn)題?
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.原因:
飛書對(duì)于code非0(code為0,表示數(shù)據(jù)請(qǐng)求正常,并且響應(yīng)碼為200)響應(yīng)碼為40x 50x,
導(dǎo)致Guzzle拋出異常,只能在GuzzleRequestExecption中進(jìn)行處理,使用系統(tǒng)自帶的RequestException是捕獲不到的
2.處理:
......
} catch (RequestException $e) {
// 處理 Guzzle 請(qǐng)求異常
if ($e->hasResponse()) {
$response = $e->getResponse();
$statusCode = $response->getStatusCode();
// 檢查響應(yīng)碼
if ($statusCode === 400) {
// 解析400的響應(yīng)
$errorData = json_decode($response->getBody(), true);
// 處理錯(cuò)誤數(shù)據(jù)
return json([
'code' => 60006,
'msg' => '響應(yīng)碼' . $statusCode . ':'. $errorData['error'] . ':' . $errorData['error_description']
]);
}
} else {
// 處理其他異常
return json([
'code' => 60007,
'msg' => '飛書響應(yīng)與GClient解析其他錯(cuò)誤'
]);
}
控制器返回了數(shù)組,應(yīng)該返回字符串或者response對(duì)象
報(bào)錯(cuò)就在“$response = $client->sendAsync($request)->wait();”,它返回了數(shù)組然后到了框架的http.php的encode方法,修改Guzzle那邊response的類型?
接觸webman 和guzzle都還不是很久,請(qǐng)指教
這句不會(huì)報(bào)錯(cuò),return $response; 會(huì)報(bào)錯(cuò),因?yàn)?$response 是數(shù)組,webman不支持返回?cái)?shù)組,你可以轉(zhuǎn)換為json組字符串,代碼類似 return json($response);
我發(fā)現(xiàn)是這樣的,其實(shí)跟Guzzle的post或sendAsync無(wú)關(guān),跟返回的數(shù)據(jù)有關(guān)。以我的需求為例,我是向飛書服務(wù)端api請(qǐng)求數(shù)據(jù):發(fā)送code請(qǐng)求accesstoken這樣 一個(gè)接口。如果正常獲取,飛書給我的是響應(yīng)碼200,guzzle能正常解析,如果響應(yīng)碼是400,guzzle就不能正常解析。 但是webman后臺(tái)打印的日志是指向Http.php 188行,但這里打印echo是沒(méi)用的,有點(diǎn)悶掉了
發(fā)現(xiàn)問(wèn)題了。要對(duì)GuzzleHttp\Exception\RequestException;進(jìn)行處理。 GuzzleHttp對(duì)響應(yīng)碼是400的當(dāng)成異常了,就拋出了,之前還是用的webman框架的RequestException進(jìn)行處理,沒(méi)捕獲到