Я использую 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?
В качестве временного решения (надеюсь, что есть лучший подход) я подписываюсь на 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);
}
Других решений пока нет …