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_factory
và http_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;
};
}