Как я могу запретить Guzzle 3 URLE кодировать параметр операции?

Я использую Guzzle 3 для работы с Hypermedia HTTP API и у меня возникают проблемы с использованием URL-путей в качестве параметров. Служба будет возвращать URL-пути для доступа к ресурсам и в основном работает, за исключением того, что параметризованный путь кодируется URLE.

Вот пример операции в описании услуги

"getWidget": {
"uri": "{path}",
"summary": "Get Widget",
"httpMethod": "GET",
"responseType": "class",
"responseClass": "Service\\Responses\\Widget",
"parameters": {
"path": {
"location": "uri"}
}
}

Я выполняю операцию, выполнив:

$client = WidgetClient::factory(array('base_url' => 'example.com'));

$args = array('path' => '/widget/abc123');
$command = $client->getCommand('getWidget', $args);
$result = $command->execute();

Когда клиент выполняет запросы: http://example.com/%2Fwidget%2Fabc123 скорее, чем http://example.com/widgetabc123

Я проследил обработку параметров до UriTemplate::expandMatch() который выполняет rawurlencode($variable) вызов, который кодирует параметр — но я не вижу четкого способа избежать кодировки.

Итак, с помощью Guzzle 3 и его сервисных описаний, как я могу передать URL-путь в качестве параметра, не кодируя его URLE?

2

Решение

В качестве временного решения (надеюсь, что есть лучший подход) я подписываюсь на client.create_request событие и изменение пути для удаления кодировки. Это начальная версия, она будет очищена до финальной версии:

public function onClientCreateRequest(Event $event)
{
/** @var Request $request */
$request = $event['request'];
if (empty($request)) {
return;
}

$url = $request->getUrl(true);
if (empty($url)) {
return;
}

$path = $url->getPath();
$path = rawurldecode($path);
$path = str_replace('//', '/', $path);

//$url->setPath($path);
$request->setPath($path);
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]