我想通过调用服务器上的Web服务将400条记录插入数据库服务器。但是,当我通过调用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服务调用插入所有记录。预先感谢。
答案 0 :(得分:0)
您可以做两件事:
将所有数据批量发送到一个请求调用中,并在服务器端执行foreach。因此您无需在服务器上发送许多请求。
第二个是您可以remove request limit
在Laravel的那条路线上,这样您就可以按顺序发送许多请求
为此,您可以按照以下步骤操作:Disable rate limiter in Laravel?
答案 1 :(得分:0)
如果要在其上发送数据的服务器没有批量插入端点,则可以在循环中添加wait函数,以在请求之间进行一些延迟。
答案 2 :(得分:0)
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++;
}
此外,还可以在工作中获得响应后添加日志记录机制。存储该数据很重要,这样您在遇到问题时可以随时参考。