我使用Guzzle 3来处理超媒体HTTP API,并且在使用URL路径作为参数时遇到了一些问题。该服务将返回访问资源的URL路径,并且除了参数化路径正在URLEncoded之外,它主要工作。
以下是服务说明中的操作示例
"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路径作为参数传递而不是URLEncoded?
答案 0 :(得分:0)
作为一种临时解决方法(我希望有更好的方法)我订阅了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);
}