私は約2時間検索してきましたが、最終応答uriの読み方がわかりません。
PHPGuzzleの以前のバージョンでは、$response->getEffectiveUrl()
を呼び出すだけで取得できます。
最終バージョンは次のようになります。
$response = $httpClient->post('http://service.com/login', [
'form_params' => [
'user' => $user,
'padss' => $pass,
]
]);
$url = $response->getEffectiveUrl();
しかし、最新バージョンでは$response
はGuzzleHttp\Psr7\Response
およびuriを取得できるメソッドはありません。
ここでリダイレクトについて読みました( http://guzzle.readthedocs.org/en/latest/quickstart.html#redirects )
https://stackoverflow.com/a/35443523/1811887
ありがとう@YauheniPrakopchyk
docs から直接のGuzzle 6.1ソリューション。
$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
track_redirects
パラメータを設定することにより、リクエストにどのリダイレクトが含まれているかを確認できます。
$client = new \GuzzleHttp\Client(['allow_redirects' => ['track_redirects' => true]]);
$response = $client->request('GET', 'http://example.com');
var_dump($response->getHeader(\GuzzleHttp\RedirectMiddleware::HISTORY_HEADER));
リダイレクトがあった場合、最後のリダイレクトは有効なURLである必要があります。
allow_redirects
の詳細については、こちらをご覧ください http://docs.guzzlephp.org/en/latest/request-options.html#allow-redirects 。
ミドルウェアを使用して、リダイレクトチェーン内のリクエストを追跡し、最後のリクエストを保存しています。最後のリクエストのURIはあなたが望むものです。
このコードを試してください:
$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());
結果:
string(24) "http://stackoverflow.com"
クラスの例:
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());
この情報を保存するには、応答ヘッダーを使用するのが最善だと思います。 X-GUZZLE-EFFECTIVE-URL
ヘッダーに有効なURLを保存する単純なクラスを作成しました。
使用法:
<?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');
受け入れられた答えは私にはうまくいきませんでしたが、途中で私を導きました:
$client = new \GuzzleHttp\Client();
$client->request('GET', $url, [
'on_stats' => function (\GuzzleHttp\TransferStats $stats) {
echo($stats->getHandlerStats()['redirect_url']);
}
]);