Avem doi http_clients în fișierul nostru de servicii personalizate __construi, una implicită de la Drupal http_client serviciu, un alt Client nou personalizat creat prin utilizarea http_client_factory și http_handler_stack servicii care urmează funcția formOptions.
Clientul personalizat a fost folosit pentru a implementa mecanismul de reîncercare al lui Guzzle prin apăsare Middleware::reîncercați în handler_stack-ul curent din serviciile noastre personalizate. Dar acest middleware pare să fie consecvent în implicit httpClient de asemenea, provocând toate apelurile clienților care trec prin retryDecider().
esenta de referinta
Vreau să separ efectul Middleware al ambilor clienți, ce ar trebui să fac?
Vă mulțumim că ne-ați oferit cota de cunoștințe!
/**
* Construiește un nou obiect de serviciu.
*/
funcția publică __construct(EntityTypeManagerInterface $entity_type_manager, ClientInterface $http_client, ClientFactory $http_client_factory, HandlerStack $stack, TimeInterface $datetime_time, ConfigFactoryInterface $config_factory) {
$this->entityTypeManager = $entity_type_manager;
$this->datetimeTime = $datetime_time;
$this->configFactory = $config_factory;
$this->httpClient = $http_client;
// Utilizați middleware de reîncercare pentru a reîncerca de 2 ori, pe baza unui timeout de 20 sec.
$stack->push(Middleware::retry($this->retryDecider(), $this->retryDelay()));
$this->customClient = $http_client_factory->fromOptions([
'handler' => $stack,
'timeout' => 20,
]);
}
/**
* {@inheritdoc}
*/
funcția publică apiRequest($tip, $metodă, matrice $date = [], $reîncercați = FALSE) {
$client = $reîncercați ? $this->customClient : $this->httpClient;
comutator ($metoda) {
cazul „POST”:
$rezultat = $client->request('POST', $this->requestUrl . '/' . $tip, [
'form_params' => $date,
'headers' => [
„Accept” => „application/x-www-form-urlencoded”,
],
]
);
pauză;
cazul „GET”:
$rezultat = $client->request('GET', $this->requestUrl . '/' . $tip, [
'query' => $date,
'headers' => [
„Accept” => „aplicație/json”,
],
]
);
pauză;
caz „PATCH”:
$rezultat = $client->request('PATCH', $this->requestUrl . '/' . $tip, [
'form_params' => $date,
'headers' => [
„Accept” => „application/x-www-form-urlencoded”,
],
]);
}
$apiRequest = $rezultat->getBody()->getContents();
return json_decode($apiRequest);
}
/**
* Decident boolean al încercărilor de reîncercare pentru Guzzle.
*/
funcția protejată retryDecider() {
funcția return (
$reîncercați,
Solicita $request,
Răspuns $răspuns = NULL,
RequestException $exception = NULL
) {
if ((0 < $reîncercări) && ($reîncercări <= 2)) {
$this->getLogger('API')->info('%uniqid SystemAction retryDecider msg="Reîncercare %retry"', [
'%uniqid' => $this->uniqid,
'%retries' => $reîncercări,
]);
}
// Limitați numărul de încercări la 3.
dacă ($reîncearcă >= 2) {
$this->getLogger('API')->info('%uniqid SystemAction retryDecider msg="Tempt on Retrying for Guzzle Client"', [
'%uniqid' => $this->uniqid,
]);
returnează FALSE;
}
// Reîncercați excepțiile de conexiune.
if ($excepție instanță de ConnectException) {
returnează TRUE;
}
dacă ($răspuns) {
// Reîncercați erorile de server.
dacă ($răspuns->getStatusCode() >= 500) {
returnează TRUE;
}
}
returnează FALSE;
};
}
/**
* Întârzierea fiecărei încercări între încercările de solicitare.
*/
funcția protejată retryDelay() {
funcție de returnare ($numberOfRetries) {
returnează 1000 * $numberOfRetries;
};
}