使用2个参数进行POST请求时:
return $this->perform($client->post("/authenticate",null, array(
"username" => 'radupass',
"password" => '@alcool', //starting with an @
)));
,美元端:
/**
* @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;
}
我得到以下异常:
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
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);
}
如果我想转义该字符怎么办?
似乎是cURL本身的一个已知问题:
在PHP中使用CURL发布以"@"
开头的文本数据一个解决方案是使用百分比编码,'@'符号将是'%40',尽管这需要一些额外的工作。
当您查看Guzzle Request Documentation时,您可以发现所有以@
符号开头的POST参数都被视为文件路径。参见他们文档中的示例:
$request = $guzzleClient->post($url, $headers, [
'file_field' => '@/path/to/file.xml'
]);
我通过setPostField()
方法分配POST参数来解决这个问题,下面是我的例子:
$request = $guzzleClient->post($url, $headers);
foreach ($postData as $key => $value) {
$request = $request->setPostField($key, $value);
}
$guzzleClient->send($request);