Guzzle 6: получить URL-адрес, который был разрешен из base_uri

В Guzzle 3 вы можете получить разрешенный URL ( фактически не открывая его) вот так:

$client = new Client([
    'base_uri' => 'http://foo.com',
]);

$request = $client->get('bar.html');

echo $request->getUrl();

В Guzzle 6 это больше не работает. Есть ли другой способ получить "http://foo.com/bar.html"?


person Thomas Landauer    schedule 27.11.2015    source источник
comment
Обратите внимание, что $client->get() возвращает объект ответа в версии 6. Чтобы получить эффективный URL-адрес, просмотрите этот ответ.   -  person robsch    schedule 09.02.2017


Ответы (2)


Вы можете использовать промежуточное программное обеспечение истории, работает как рекламируется:

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

$container = [];

$stack = HandlerStack::create();
$stack->push(Middleware::history($container));

$client = new Client([
    'base_uri' => 'http://foo.com',
    'handler' => $stack,
]);

$response = $client->request('GET', 'bar.html');

/* @var RequestInterface $request */
$request = $container[0]['request'];

echo $request->getUri();

Для справки см. http://docs.guzzlephp.org/en/latest/testing.html#history-middleware.

person localheinz    schedule 20.12.2015
comment
Правильная команда для получения экземпляра RequestInterface: $request = $container[0]['request']; - person ocornu; 25.10.2017

Немного поздновато, но для справки.

Вы можете сделать это с \GuzzleHttp\Psr7\UriResolver::resolve($baseUri, $relUri);

Он преобразует относительный URI в новый URI, который разрешается относительно базового URI.

$baseUri и $relUri являются экземплярами \Psr\Http\Message\UriInterfaceUriInterface.

person zstate    schedule 27.10.2017