如何防止Guzzle 3对URLE编码操作参数?

时间:2015-03-02 17:03:28

标签: php url uri guzzle

我使用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?

1 个答案:

答案 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);
}