狂欢 |异步请求 |资源类型错误无效
Guzzle | Async requests | Invalid resource type error
我正在尝试链接 http 请求,其中第二个请求取决于第一个请求的响应。我遇到了 Guzzle Client->sendAsync()。
我得到的错误:
exception: "InvalidArgumentException"
file: "...\guzzlehttp\psr7\src\functions.php"
line: 116
message: "Invalid resource type: array"
这是我目前的情况:
$client = new Client([...]);
$headers = [...];
$req = new Psr7\Request('GET', '/api/someapi', $headers);
$finalResponse = $client->sendAsync($req)->then(function($response1) use ($client) {
$firstResponse = json_decode($response1->getBody()->getContents());
// $firstResponse is an array
$secondHeaders = [...];
$secondRequest = new Psr7\Request('POST', 'api/anotherapi', $searchHeaders, [
'json' => [
'field1' => 'val1',
'field2' => 'val2',
'field3' => json_encode($firstResponse),
'field4' => 'val3'
]
]);
$secondResponse = $client->sendAsync($searchRequest)->function($response2) use ($client) {
return $response2->getBody()->getContents();
});
return $secondResponse->wait();
});
return $finalResponse->wait();
关于我做错了什么的想法?
您必须手动将 PHP 数组编码为 JSON 才能与 Psr7\Request
一起使用
$secondRequest = new Psr7\Request('POST', 'api/anotherapi', $searchHeaders, json_encode([
'field1' => 'val1',
'field2' => 'val2',
'field3' => json_encode($firstResponse),
'field4' => 'val3'
]));
或者用->postAsync()
代替->sendAsync()
,更简单
$client = new Client();
$headers = [];
$finalResponse = $client->getAsync('/api/someapi', ['headers' => $headers])
->then(function ($response1) use ($client) {
$firstResponse = json_decode($response1->getBody()->getContents());
// $firstResponse is an array
$secondHeaders = [];
$secondResponse = $client->postAsync('api/anotherapi', [
'headers' => $secondHeaders,
'json' => [
'field1' => 'val1',
'field2' => 'val2',
'field3' => json_encode($firstResponse),
'field4' => 'val3'
],
])->then(function ($response2) use ($client) {
return $response2->getBody()->getContents();
});
// You don't need to call ->wait() here, Guzzle will resolve the promise for you
return $secondResponse;
});
return $finalResponse->wait();
如果您想使用 "json" 传递参数,则必须像下面这样修改代码:
$secondRequest = new Psr7\Request('POST', 'api/anotherapi', $searchHeaders);
$secondResponse = $client->sendAsync($searchRequest, [
'json' => [
'field1' => 'val1',
'field2' => 'val2',
'field3' => json_encode($firstResponse),
'field4' => 'val3'
])->function($response2) use ($client) {
return $response2->getBody()->getContents();
});
请参阅此处的文档 (http://docs.guzzlephp.org/en/stable/quickstart.html):
An easy way to upload JSON data and set the appropriate header is using the json request option:
$r = $client->request('PUT', 'http://httpbin.org/put', [
'json' => ['foo' => 'bar']
]);
查看@Alexey Shokov 的回答了解更多详情。
我正在尝试链接 http 请求,其中第二个请求取决于第一个请求的响应。我遇到了 Guzzle Client->sendAsync()。
我得到的错误:
exception: "InvalidArgumentException"
file: "...\guzzlehttp\psr7\src\functions.php"
line: 116
message: "Invalid resource type: array"
这是我目前的情况:
$client = new Client([...]);
$headers = [...];
$req = new Psr7\Request('GET', '/api/someapi', $headers);
$finalResponse = $client->sendAsync($req)->then(function($response1) use ($client) {
$firstResponse = json_decode($response1->getBody()->getContents());
// $firstResponse is an array
$secondHeaders = [...];
$secondRequest = new Psr7\Request('POST', 'api/anotherapi', $searchHeaders, [
'json' => [
'field1' => 'val1',
'field2' => 'val2',
'field3' => json_encode($firstResponse),
'field4' => 'val3'
]
]);
$secondResponse = $client->sendAsync($searchRequest)->function($response2) use ($client) {
return $response2->getBody()->getContents();
});
return $secondResponse->wait();
});
return $finalResponse->wait();
关于我做错了什么的想法?
您必须手动将 PHP 数组编码为 JSON 才能与 Psr7\Request
$secondRequest = new Psr7\Request('POST', 'api/anotherapi', $searchHeaders, json_encode([
'field1' => 'val1',
'field2' => 'val2',
'field3' => json_encode($firstResponse),
'field4' => 'val3'
]));
或者用->postAsync()
代替->sendAsync()
,更简单
$client = new Client();
$headers = [];
$finalResponse = $client->getAsync('/api/someapi', ['headers' => $headers])
->then(function ($response1) use ($client) {
$firstResponse = json_decode($response1->getBody()->getContents());
// $firstResponse is an array
$secondHeaders = [];
$secondResponse = $client->postAsync('api/anotherapi', [
'headers' => $secondHeaders,
'json' => [
'field1' => 'val1',
'field2' => 'val2',
'field3' => json_encode($firstResponse),
'field4' => 'val3'
],
])->then(function ($response2) use ($client) {
return $response2->getBody()->getContents();
});
// You don't need to call ->wait() here, Guzzle will resolve the promise for you
return $secondResponse;
});
return $finalResponse->wait();
如果您想使用 "json" 传递参数,则必须像下面这样修改代码:
$secondRequest = new Psr7\Request('POST', 'api/anotherapi', $searchHeaders);
$secondResponse = $client->sendAsync($searchRequest, [
'json' => [
'field1' => 'val1',
'field2' => 'val2',
'field3' => json_encode($firstResponse),
'field4' => 'val3'
])->function($response2) use ($client) {
return $response2->getBody()->getContents();
});
请参阅此处的文档 (http://docs.guzzlephp.org/en/stable/quickstart.html):
An easy way to upload JSON data and set the appropriate header is using the json request option:
$r = $client->request('PUT', 'http://httpbin.org/put', [
'json' => ['foo' => 'bar']
]);
查看@Alexey Shokov 的回答了解更多详情。