我在laravel 6.x版本的应用程序中使用Guzzle来调用一个外部端点。如果响应状态为200,我试图通过以下代码来访问响应的属性
<?php
namespace App\Http\Controllers\API;
use GuzzleHttp\Client;
use Illuminate\Support\Facades\Log;
class AccountController extends Controller
{
public function createdDedicatedAccount()
{
$client = new Client(['verify' => false]);
$secretKey = 'some_secret_key';
$url = 'target_url';
$headers = [
'Authorization' => 'Bearer ' . $secretKey,
'content-type' => 'application/json',
];
Log::info('Requesting dedicated account assignment to customer: ' . 24101696);
$response = $client->request('POST', $url, [
'headers' => $headers,
'json' => ['customer' => 24101696]
]);
if ($response->getStatusCode() === 200) {
Log::info('Dedicated account assigned.');
$dedicatedAccount = json_decode($response->getBody());
Log::info('dedicatedAccount: ' . $dedicatedAccount);
Log::info('account_number: ' . $dedicatedAccount->data->account_number);
}
}
但是当我试图访问属性时,我得到了这个异常的错误信息
stdClass类的对象无法转换为字符串。
以下是记录的内容
[2020-05-14 13:01:17] local.INFO: Customer created successfully with id: 24101696
[2020-05-14 13:01:17] local.INFO: Requesting dedicated account assignment to customer: 24101696
[2020-05-14 13:01:18] local.INFO: Dedicated account assigned.
[2020-05-14 13:01:18] local.ERROR: Object of class stdClass could not be converted to string
如果我不 json_decode
的 response->getBody()
,我能够成功登录 dedicatedAccount
这样
[2020-05-14 13:47:35] local.INFO: Customer created successfully on with id: 24103237
[2020-05-14 13:47:35] local.INFO: Requesting dedicated account assignment to customer: 24103237
[2020-05-14 13:47:37] local.INFO: Dedicated account assigned.
[2020-05-14 13:47:37] local.INFO: dedicated_account: {
"status": true,
"message": "Account successfully created",
"data": {
"bank": {
"name": "Test Bank",
"id": 25,
"slug": "test-bank"
},
"account_name": "TEST TEST",
"account_number": "9930892996",
"assigned": true,
"currency": "NGN",
"metadata": null,
"active": true,
"id": 89505,
"created_at": "2020-03-30T10:13:13.000Z",
"updated_at": "2020-05-14T12:47:38.000Z",
"assignment": {
"integration": 103612,
"assignee_id": 24103237,
"assignee_type": "Customer",
"expired": false,
"account_type": "PAY-WITH-TRANSFER-RECURRING",
"assigned_at": "2020-05-14T12:47:38.588Z",
"expired_at": null
},
"customer": {
"id": 24103237,
"first_name": "Test",
"last_name": "Test",
"email": "[email protected]",
"customer_code": "CUS_ofuz99njymux0g9",
"phone": null,
"metadata": null,
"risk_action": "default"
}
}
}
[2020-05-14 13:47:37] local.ERROR: Undefined property: GuzzleHttp\Psr7\Stream::$data
但最后还是会出现另一个异常错误信息。
我得到的响应的正确处理方式是什么,以便我可以访问对象的属性?
我相信你的错误是在以下几行代码中。
if ($response->getStatusCode() === 200) {
Log::info('Dedicated account assigned.');
$dedicatedAccount = json_decode($response->getBody());
Log::info('dedicatedAccount: ' . $dedicatedAccount);
Log::info('account_number: ' . $dedicatedAccount->data->account_number);
}
为了快速修复,请删除这行 Log::info('dedicatedAccount: ' . $dedicatedAccount);
并尝试运行你的代码。让我解释一下。一旦你解码了你的响应体,它就会变成一个带有从API发送的属性的对象。这个对象不能被记录,因为Log::info函数期望的是一个字符串而不是一个对象。如果你真的想看到这个对象,那么就把它作为一个json编码的字符串来记录,从而把上面的代码改为。
if ($response->getStatusCode() === 200) {
Log::info('Dedicated account assigned.');
$dedicatedAccount = json_decode($response->getBody());
Log::info('dedicatedAccount: ' . json_encode($dedicatedAccount));
Log::info('account_number: ' . $dedicatedAccount->data->account_number);
}
希望能帮到你