2013-05-29 7 views
9

При выполнении запроса POST с 2-мя параметрами:жрать вопрос после параметра

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) 

Кажется, что клиент пытается открыть файл вместо этого.

EDIT

Глядя на исходный код жрать я вижу в:

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

Что делать, если я хочу, чтобы избежать этого персонажа?

ответ

4

Кажется быть известная проблема с самой Curl:

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

Одним из решений было бы использовать процентное кодирование и «@» символов будет «% 40», несмотря на то, что нуждается в некоторых дополнительных Работа.

См. Также this нить.

3

При взгляде на 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); 
Смежные вопросы