首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Guzzle参数问题

Guzzle参数问题
EN

Stack Overflow用户
提问于 2013-05-29 19:30:18
回答 2查看 5.6K关注 0票数 9

当使用两个参数进行POST请求时:

代码语言:javascript
运行
复制
return $this->perform($client->post("/authenticate",null, array(
  "username" => 'radupass',
  "password" => '@alcool', //starting with an @
)));

其中$client:

代码语言:javascript
运行
复制
/**
* @return \Guzzle\Service\Client
*/
public function getClient()
{
  if ($this->_client === null) {
    $this->_client = new Guzzle\Service\Client($this->baseUrl, $this->_options);
    $this->_client->setDefaultHeaders(array(
      "X-WebsiteId" => $this->websiteId,
      "X-AccessToken" => $this->accessToken,
    ));
}
return $this->_client;
}

我得到了以下异常:

代码语言:javascript
运行
复制
2013/05/29 11:08:29 [error] [exception.Guzzle\Common\Exception\InvalidArgumentException] exception 'Guzzle\Common\Exception\InvalidArgumentException' with message 'Unable to open lcool for reading' in /home/xxx/site/vendor/guzzle/guzzle/src/Guzzle/Http/Message/PostFile.php:58
Stack trace:
#0 /home/xxx/site/vendor/guzzle/guzzle/src/Guzzle/Http/Message/PostFile.php(25): Guzzle\Http\Message\PostFile->setFilename('@lcool')
#1 /home/xxx/site/vendor/guzzle/guzzle/src/Guzzle/Http/Message/EntityEnclosingRequest.php(245): Guzzle\Http\Message\PostFile->__construct('password', '@lcool', NULL)
#2 /home/xxx/site/vendor/guzzle/guzzle/src/Guzzle/Http/Message/EntityEnclosingRequest.php(273): Guzzle\Http\Message\EntityEnclosingRequest->addPostFile('password', '@lcool', NULL, false)
#3 /home/xxx/site/vendor/guzzle/guzzle/src/Guzzle/Http/Message/RequestFactory.php(127): Guzzle\Http\Message\EntityEnclosingRequest->addPostFiles(Array)
#4 /home/xxx/site/vendor/guzzle/guzzle/src/Guzzle/Http/Client.php(256): Guzzle\Http\Message\RequestFactory->create('POST', 'http://api.subs...', Object(Guzzle\Common\Collection), Array)
#5 /home/xxx/site/vendor/guzzle/guzzle/src/Guzzle/Http/Client.php(336): Guzzle\Http\Client->createRequest('POST', '/authenticate', NULL, Array)
#6 /home/xxx/site/frontend/components/SubServerClient.php(117): Guzzle\Http\Client->post('/authenticate', NULL, Array)

客户端似乎正在尝试打开一个文件。

编辑

查看我在下面的代码中看到的Guzzle源代码:

https://github.com/guzzle/guzzle/blob/master/src/Guzzle/Http/Message/RequestFactory.php#L88

代码语言:javascript
运行
复制
 if (is_array($body) || $body instanceof Collection) {
                // Normalize PHP style cURL uploads with a leading '@' symbol
                foreach ($body as $key => $value) {
                    if (is_string($value) && substr($value, 0, 1) == '@') {
                        $request->addPostFile($key, $value);
                        unset($body[$key]);
                    }
                }
                // Add the fields if they are still present and not all files
                $request->addPostFields($body);
            }

如果我想转义这个字符怎么办?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-29 19:57:38

这似乎是cURL本身的一个已知问题:

Using CURL in PHP to post text data starting with "@"

一种解决方案是使用百分比编码,“@”符号将是“%40”,即使这需要一些额外的工作。

另请参见this线程。

票数 4
EN

Stack Overflow用户

发布于 2015-11-11 00:42:11

当你查看Guzzle Request Documentation时,你会发现所有以@ sign开头的POST参数都被认为是一个文件路径。请参阅其文档中的示例:

代码语言:javascript
运行
复制
$request = $guzzleClient->post($url, $headers, [
    'file_field'   => '@/path/to/file.xml'
]);

我通过分配POST参数的setPostField()方法解决了这个问题,下面是我的示例:

代码语言:javascript
运行
复制
$request = $guzzleClient->post($url, $headers);
foreach ($postData as $key => $value) {
    $request = $request->setPostField($key, $value);
}
$guzzleClient->send($request);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16812713

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档