Điểm:0

Việc thêm Middleware::retry() vào httpClient tùy chỉnh sẽ ảnh hưởng đến http_client mặc định

lá cờ nl

Chúng tôi có hai http_client trong tệp dịch vụ tùy chỉnh của mình trên __xây dựng, một mặc định từ Drupal's http_client dịch vụ, một Khách hàng mới tùy chỉnh khác được tạo bằng cách sử dụng http_client_factoryhttp_handler_stack dịch vụ sau chức năng formOptions.

Ứng dụng khách tùy chỉnh đã được sử dụng để triển khai cơ chế thử lại của guzzle bằng cách đẩy Phần mềm trung gian::thử lại vào handler_stack hiện tại trong các dịch vụ tùy chỉnh của chúng tôi. Nhưng phần mềm trung gian này dường như phù hợp với mặc định httpClient đồng thời, khiến tất cả các cuộc gọi của khách hàng đều đi qua thử lạiDecider(). ý chính của tài liệu tham khảo

Tôi muốn tách hiệu ứng Middleware của cả hai máy khách, tôi phải làm gì? Cảm ơn đã cung cấp chia sẻ kiến ​​​​thức của bạn!

  /**
   * Xây dựng một đối tượng dịch vụ mới.
   */
  chức năng công khai __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;

    // Sử dụng phần mềm trung gian thử lại để thử lại 2 lần, dựa trên thời gian chờ là 20 giây.
    $stack->push(Middleware::retry($this->retryDecider(), $this->retryDelay()));
    $this->customClient = $http_client_factory->fromOptions([
      'trình xử lý' => $stack,
      'hết giờ' => 20,
    ]);
  }

  /**
   * {@inheritdoc}
   */
  hàm công khai apiRequest($type, $method, array $data = [], $retry = FALSE) {
    $client = $thử lại? $this->customClient : $this->httpClient;
    chuyển ($phương thức) {
      trường hợp "POST":
        $result = $client->request('POST', $this->requestUrl . '/' . $type, [
          'form_params' => $data,
          'tiêu đề' => [
            'Chấp nhận' => 'ứng dụng/x-www-form-urlencoding',
          ],
        ]
        );
        nghỉ;

      trường hợp "NHẬN":
        $result = $client->request('GET', $this->requestUrl . '/' . $type, [
          'truy vấn' => dữ liệu $,
          'tiêu đề' => [
            'Chấp nhận' => 'ứng dụng/json',
          ],
        ]
        );
        nghỉ;

      trường hợp "PATCH":
        $result = $client->request('PATCH', $this->requestUrl . '/' . $type, [
          'form_params' => $data,
          'tiêu đề' => [
            'Chấp nhận' => 'ứng dụng/x-www-form-urlencoding',
          ],
        ]);
    }

    $apiRequest = $result->getBody()->getContents();

    trả về json_decode($apiRequest);
  }

  /**
   * Boolean quyết định các lần thử lại cho Guzzle.
   */
  chức năng được bảo vệ retryDecider() {
    hàm trả về (
      $thử lại,
      Yêu cầu $request,
      Phản hồi $ phản hồi = NULL,
      RequestException $ngoại lệ = NULL
   ) {
      if ((0 < $retries) && ($retries <= 2)) {
        $this->getLogger('API')->info('%uniqid SystemAction retryDecider msg="Đang thử lại %retries"', [
          '%uniqid' => $this->uniqid,
          '%thử lại' => $thử lại,
        ]);
      }
      // Giới hạn số lần thử lại là 3.
      nếu ($thử lại >= 2) {
        $this->getLogger('API')->info('%uniqid SystemAction retryDecider msg="Cố gắng thử lại ứng dụng khách Guzzle"', [
          '%uniqid' => $this->uniqid,
        ]);
        trả về SAI;
      }

      // Thử lại các ngoại lệ kết nối.
      if ($ngoại lệ instanceof ConnectException) {
        trả về ĐÚNG;
      }

      nếu ($ phản hồi) {
        // Thử lại lỗi máy chủ.
        if ($response->getStatusCode() >= 500) {
          trả về ĐÚNG;
        }
      }

      trả về SAI;
    };
  }

  /**
   * Độ trễ của mỗi lần thử lại giữa các lần thử yêu cầu.
   */
  chức năng được bảo vệ retryDelay() {
    hàm trả về ($numberOfRetries) {
      trả về 1000 * $numberOfRetries;
    };
  }
Điểm:1
lá cờ vg

Dường như với tôi bằng cách thay đổi tiêm ngăn xếp $, bạn ảnh hưởng đến cái mặc định.

Hãy thử tạo một cái mới với HandlerStack::create(); hoặc sao chép $stack bạn được tiêm, bằng cách $mystack = bản sao $stack;

Ngoài ra còn có onHandlerStack sự kiện bạn có thể áp dụng, dựa trên "cái gì", tôi không thể nói cho bạn biết;)

Michael Chen avatar
lá cờ nl
Vâng, tôi đã thử nghiệm và nó hoạt động! Sau gợi ý của bạn, tôi đã xem xét [tài liệu](https://docs.guzzlephp.org/en/stable/handlers-and-middleware.html#handlerstack) của guzzle và vuala! Cảm ơn! Dán mã khả thi bên dưới. ```php $newStack = HandlerStack::create(); $newStack->push(Middleware::retry($this->retryDecider(), $this->retryDelay())); $this->wvtClient = $http_client_factory->fromOptions([ 'trình xử lý' => $newStack, 'hết giờ' => 20, ]); ```

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.