gpt4 book ai didi

guzzle - 发送多个请求时如何将结果与请求匹配?

转载 作者:行者123 更新时间:2023-12-03 15:55:30 28 4
gpt4 key购买 nike

A. 总结

顾名思义,Guzzle 允许一次发送多个请求以节省时间,如 documentation .

$responses = $client->send(array(
$requestObj1,
$requestObj2,
...
));

(given that each request object is an instance of
Guzzle\Http\Message\EntityEnclosingRequestInterface)

当响应返回时,为了识别哪个响应针对哪个请求,我们可以遍历每个请求并获取响应(仅在执行上述命令后可用):
$response1 = $requestObj1->getResponse();
$response2 = $requestObj2->getResponse();
...

B. 问题

如果请求对象包含相同的数据。无法识别原始请求。

假设我们有以下场景,我们需要创建 2 篇文章:A 和 B 在远程服务器上:something.com/articles/create.json

每个请求都有相同的 POST 数据:
subject: This is a test article

创建后,带有 2 个位置的 Guzzle 响应返回:
something.com/articles/223.json
something.com/articles/245.json

使用上面的方法链接response-to-its-request,我们还是不知道哪个response是针对哪篇文章的, 因为请求对象完全一样 .

因此在我的数据库中我无法写下结果:
article A -> Location: 245.json
article B -> Location: 223.json

因为它可以是相反的方式:
article A -> Location: 223.json
article B -> Location: 245.json

一个解决方案是在 POST 请求中加入一些额外的参数,例如
subject: This is a test article
record: A

但是,距离服务器会返回错误并且不会创建文章,因为它不了解关键的“记录”。远程服务器是第三方服务器,我无法改变它的工作方式。

另一个合适的解决方案是在请求对象上设置一些特定的 id/tag,以便我们之后可以识别它。但是,我已经查看了文档,但没有方法可以像
$request->setID("id1")

or

$request->setTag("id1")

这已经困扰我几个月了,但仍然无法解决这个问题。

如果您有解决方案,请告诉我。

非常感谢,你救了我!!!!

感谢您阅读这篇长文。

最佳答案

我找到了一种正确的方法,Guzzle 允许在请求完成后添加回调。所以我们可以通过在批处理中的每个请求上设置它来实现这一点

默认情况下,每个请求都可以这样创建

$request = $client->createRequest('GET', 'http://httpbin.org', [
'headers' => ['X-Foo' => 'Bar']
]);

所以,要实现我们想要的:
$allRequests = [];
$allResults = [];

for($k=0; $k<=10; $k++){
$allRequests['key_'.$k] = $client->createRequest('GET', 'http://httpbin.org?id='.$k, [
'headers' => ['X-Foo' => 'Bar'],
'events' => [
'complete' => function ($e) use (&$allResults, $k){
$response = $e->getResponse();
$allResults['key_'.$k] = $response->getBody().'';
}
]
]);
}

$client->sendAll(array_values($allRequests));

print_r($allResults);

所以现在 $allResults 有每个相应请求的结果。

例如$allResults['key_1'] 是 $allRequests['key_1'] 的结果

关于guzzle - 发送多个请求时如何将结果与请求匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22649888/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com