Puncte:0

Adăugarea Middleware::retry() la un httpClient personalizat afectează http_client implicit

drapel nl

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;
    };
  }
Puncte:1
drapel vg

Mi se pare ca prin modificarea injectatului $stack, îl afectați pe cel implicit.

Încercați să creați unul nou cu HandlerStack::create(); sau clonează $stack-ul care ți-a fost injectat, de $mystack = clona $stack;

Există, de asemenea, onHandlerStack eveniment la care ai putea aplica, pe baza „ce”, nu pot să-ți spun ;)

Michael Chen avatar
drapel nl
Da, i-am dat un test și a funcționat! După sugestia ta, m-am uitat în [documentul] (https://docs.guzzlephp.org/en/stable/handlers-and-middleware.html#handlerstack) și vuala lui guzzle! Mulțumiri! Lipirea codului operabil mai jos. ```php $newStack = HandlerStack::create(); $newStack->push(Middleware::retry($this->retryDecider(), $this->retryDelay())); $this->wvtClient = $http_client_factory->fromOptions([ 'handler' => $newStack, 'timeout' => 20, ]); ```

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.