我有400条记录要通过服务器上的调用Web服务插入数据库服务器。但是,当我循环插入调用Web服务时,我收到一个错误:
致命错误:未捕获GuzzleHttp \ Exception \ ClientException:客户端错误429请求太多
我试试这段代码:
$http = new \GuzzleHttp\Client();
foreach ($data as $key => $value) {
$response = $http->post('http://192.168.1.33/APIServer/public/api/data', [
'form_params' => $value,
]);
}
我循环的所有记录都是400行。如何通过使用Guzzle的Web服务调用插入所有记录。先谢谢了。
如果要发送数据的服务器没有批量插入端点,则可以在循环中添加wait函数以在请求之间进行一些延迟。
GuzzleHttp
客户端根据服务器发送的响应代码抛出异常。在您的情况下,第三方在发出一定数量的请求后会向您发送429
状态代码的回复。然后由GuzzleHttp\Exception\ClientException
抛回。
要解决此问题,您可以使用延迟排队的作业,创建一个作业SendApiRequest
:
<?php
namespace App\Jobs;
use App\Jobs\Job;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
class SendApiRequest extends Job implements ShouldQueue
{
use InteractsWithQueue, SerializesModels;
/**
* \GuzzleHttp\Client
*/
private $http;
/**
* Data array
*/
private $data;
/**
* Url string
*/
private $url = 'http://192.168.1.33/APIServer/public/api/data';
/**
* Create a new job instance.
*/
public function __construct(Client $http, array $data)
{
$this->http = $http;
$this->data = $data;
}
/**
* Create a new peerreview
*
* @return void
*/
public function handle()
{
$response = $this->http->post($this->url, $data);
return $response;
}
}
然后你可以使用延迟的作业队列调用api(让我们说第三方最多允许每分钟60个请求:
$rateLimitPerMinute = 60;
$http = new \GuzzleHttp\Client();
$counter = 1;
foreach ($data as $key => $value) {
$delayInMinutes = intval($counter/$rateLimitPerMinute);
SendApiRequest::dispatch($http, $value)->delay(now()->addMinutes($delayInMinutes));
$counter++;
}
另外,作为旁注,您可以在作业中获得响应后添加日志记录机制。存储该数据非常重要,以便您可以在以后遇到问题时随时参考。
你可以做两件事:
remove request limit
所以它允许你按顺序发送许多请求
为此,您可以遵循:Disable rate limiter in Laravel?