web-dev-qa-db-fra.com

Comment lire l'URL effective de la réponse dans Guzzle ~ 6.0

Je recherche depuis environ 2 heures et je n'arrive pas à comprendre comment lire la réponse finale uri.

Dans les versions précédentes de PHP Guzzle vous appelez simplement $response->getEffectiveUrl() et vous obtenez.

Je m'attendais à avoir quelque chose de similaire dans la nouvelle version, donc le code final ressemble à ceci:

$response = $httpClient->post('http://service.com/login', [
    'form_params' => [
        'user'   => $user,
        'padss'  => $pass,
    ]
]);

$url = $response->getEffectiveUrl();

Mais dans la dernière version $response est maintenant un GuzzleHttp\Psr7\Response et aucune méthode ne me permet de récupérer l'uri.

J'ai lu des informations sur les redirections ici ( http://guzzle.readthedocs.org/en/latest/quickstart.html#redirects ) mais cela ne dit rien sur

MISE À JOUR: La version 6.1 vous permet désormais de le faire facilement:

https://stackoverflow.com/a/35443523/1811887

Merci @YauheniPrakopchyk

32
joserobleda

Guzzle 6.1 solution dès le docs .

$client = new \GuzzleHttp\Client();

$client->get('http://some.site.com', [
    'query'   => ['get' => 'params'],
    'on_stats' => function (TransferStats $stats) use (&$url) {
        $url = $stats->getEffectiveUri();
    }
])->getBody()->getContents();

echo $url; // http://some.site.com?get=params
48
Yauheni Prakopchyk

Vous pouvez vérifier les redirections que votre demande avait en définissant track_redirects paramètre:

$client = new \GuzzleHttp\Client(['allow_redirects' => ['track_redirects' => true]]);

$response = $client->request('GET', 'http://example.com');

var_dump($response->getHeader(\GuzzleHttp\RedirectMiddleware::HISTORY_HEADER));

S'il y a eu des redirections, la dernière devrait être votre URL effective, ainsi que votre URL initiale.

Vous pouvez en savoir plus sur allow_redirects ici http://docs.guzzlephp.org/en/latest/request-options.html#allow-redirects .

17
bgaluszka

J'utilise un middleware pour suivre les demandes dans la chaîne de redirection et enregistrer la dernière. L'URI de la dernière demande est ce que vous voulez.

Essayez ce code:

$stack = \GuzzleHttp\HandlerStack::create();
$lastRequest = null;
$stack->Push(\GuzzleHttp\Middleware::mapRequest(function (\Psr\Http\Message\RequestInterface $request) use(&$lastRequest) {
    $lastRequest = $request;
    return $request;
}));

$client = new Client([
    'handler' => $stack,
    \GuzzleHttp\RequestOptions::ALLOW_REDIRECTS => true
]);

$request = new \GuzzleHttp\Psr7\Request('GET', 'http://httpbin.org/redirect-to?url=http://stackoverflow.com');
$response = $client->send($request);
var_dump($lastRequest->getUri()->__toString());

Résultat:

string(24) "http://stackoverflow.com"

Exemple avec classe:

class EffectiveUrlMiddleware
{
    /**
     * @var \Psr\Http\Message\RequestInterface
     */
    private $lastRequest;

    /**
     * @param \Psr\Http\Message\RequestInterface $request
     *
     * @return \Psr\Http\Message\RequestInterface
     */
    public function __invoke(\Psr\Http\Message\RequestInterface $request)
    {
        $this->lastRequest = $request;
        return $request;
    }

    /**
     * @return \Psr\Http\Message\RequestInterface
     */
    public function getLastRequest()
    {
        return $this->lastRequest;
    }
}

$stack = \GuzzleHttp\HandlerStack::create();
$effectiveYrlMiddleware = new EffectiveUrlMiddleware();
$stack->Push(\GuzzleHttp\Middleware::mapRequest($effectiveYrlMiddleware));

$client = new Client([
    'handler' => $stack,
    \GuzzleHttp\RequestOptions::ALLOW_REDIRECTS => true
]);

$request = new \GuzzleHttp\Psr7\Request('GET', 'http://httpbin.org/redirect-to?url=http://stackoverflow.com');
$response = $client->send($request);
var_dump($effectiveYrlMiddleware->getLastRequest()->getUri()->__toString());

Je pense qu'il est préférable d'utiliser des en-têtes de réponse pour stocker ces informations. J'ai écrit une classe simple qui enregistre l'url efficace dans X-GUZZLE-EFFECTIVE-URL entête:

https://Gist.github.com/Thinkscape/43499cfafda1af8f606d

Usage:

<?php
use GuzzleHttp\Client;
use Thinkscape\Guzzle\EffectiveUrlMiddleware;

// Add the middleware to stack and create guzzle client
$stack = HandlerStack::create();
$stack->Push(EffectiveUrlMiddleware::middleware());
$client = new Client(['handler' => $stack]);

// Test it out!
$response = $client->get('http://bit.ly/1N2DZdP');
echo $response->getHeaderLine('X-GUZZLE-EFFECTIVE-URL');
6
Artur Bodera

La réponse acceptée n'a pas fonctionné pour moi mais m'a conduit sur le chemin:

$client = new \GuzzleHttp\Client();
$client->request('GET', $url, [
    'on_stats' => function (\GuzzleHttp\TransferStats $stats) {
        echo($stats->getHandlerStats()['redirect_url']);
    }
]);
4
Sebastien Horin