PHP - промежуточное программное обеспечение Guzzle - PullRequest
0 голосов
/ 29 января 2019

Я использую API Pole Emploi, но через 25 минут после истечения срока действия моего токена я сталкиваюсь с ошибкой 401.

Я искал способ получить новый токен и повторить запрос, но никак не могдля меня, чтобы понять, как работают Middlewares, и если я должен использовать промежуточное программное обеспечение для своих нужд.

В документации Guzzle это написано:

Функции Middleware возвращают функцию, которая принимает следующееобработчик для вызова.Эта возвращаемая функция затем возвращает другую функцию, которая действует как составной обработчик - она ​​принимает запрос и параметры и возвращает обещание, которое выполняется с ответом.Составленное промежуточное программное обеспечение может изменять запрос, добавлять пользовательские параметры запроса и изменять обещание, возвращаемое обработчиком нисходящего потока.

И это пример кода из документов:

use Psr\Http\Message\RequestInterface;

function my_middleware()
{
    return function (callable $handler) {
        return function (RequestInterface $request, array $options) use ($handler) {
            return $handler($request, $options);
        };
    };
}

Так что я думаю, что мне нужно выполнить «обещание», чтобы увидеть, является ли его HTTP-код 401, а затем получить новый токен и повторить запрос?

Я заблудился, поэтому я был бы признателен, если бы кто-то смогобъясните мне логику этого другими словами, может быть:)

Заранее спасибо.

1 Ответ

0 голосов
/ 08 февраля 2019

Я бы не рекомендовал делать это, так как это может стать адом для отладки вашего приложения, и, насколько мне известно, Guzzle на самом деле не разрешает доступ к клиенту из промежуточного программного обеспечения.Независимо от того, что вы можете использовать Обещания, чтобы обойти.На вашем месте я бы обновлял токен перед другими запросами или периодически обновлялся.Это может быть хорошо, если вы запускаете запросы один за другим, но в пуле это станет кошмаром, потому что у вас может получиться, что токен выборки скрипта будет слишком часто, и тогда какой-то запрос закончится устаревшим токеном.

Во всяком случае, вот пример:

use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
use GuzzleHttp\Client;
use GuzzleHttp\HandlerStack;

function my_middleware()
{
    return function (callable $handler) {
        return function (RequestInterface $request, array $options) use ($handler) {
            /**
             * @var $promise \GuzzleHttp\Promise\Promise
             */
            $promise = $handler($request, $options);

            return $promise->then(
                function (ResponseInterface $response) use ($request, $options) {
                    if ($response->getStatusCode() === 404) {
                        var_dump($response->getStatusCode());
                        var_dump(strlen($response->getBody()));

                        // Pretend we are getting new token key here
                        $client = new Client();
                        $key = $client->get('https://www.iana.org/domains/reserved');

                        // Then we modify the failed request. For your case you use ->withHeader() to change the
                        // Authorization header with your token.
                        $uri = $request->getUri();
                        $uri = $uri->withHost('google.com')->withPath('/');

                        // New instance of Request
                        $request = $request->withUri($uri);

                        // Send the request again with our new header/URL/whatever
                        return $client->sendAsync($request, $options);
                    }

                    return $response;
                }
            );
        };
    };
}

$handlerStack = HandlerStack::create();
$handlerStack->push(my_middleware());

$client = new Client([
    'base_uri' => 'https://example.org',
    'http_errors' => false,
    'handler' => $handlerStack
]);

$options = [];

$response = $client->request('GET', '/test', $options);

var_dump($response->getStatusCode());
var_dump(strlen($response->getBody()));
echo $response->getBody();
...