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;
};
}