2015-02-13 5 views
1

Я пытаюсь использовать Guzzle для использования RESTful API. Читая Guzzle documentation, я вызываю методы как get и post для настройки запроса, а затем send для фактического запуска HTTP-запроса.guzzlehttp/guzzle отправляет HTTP-запрос раньше -> send()

$request = $client->post('http://httpbin.org/post', array(), array(
    'custom_field' => 'my custom value', 
    'file_field' => '@/path/to/file.xml' 
)); 

$response = $request->send(); 

Однако в моем случае, это, кажется, запрос HTTP посылается во время вызова post без полей. Вот мой код

define('CUST_ID', 'blahblah'); 
define('API_KEY', 'verysecure'); 

// Construct the underlying Guzzle client 
$oClient = new \GuzzleHttp\Client(
    ['base_url' => 
    ['http://api.postmates.com/{version}/', ['version' => 'v1']], 
    'defaults' => [ 
     // HTTP Basic auth header, username is api key, password is blank 
     'auth' => [API_KEY, ''], 
    ]]); 
$oRq = $oClient->post(
    "customers/" . CUST_ID . "/delivery_quotes", 
    [], 
    ['pickup_address' => '232 E Manhattan Ave, Denver, CO 80203', 
    'dropoff_address' => '4400 Midwest St, Denver, CO 80205']); 

Запрос, что выходит, хотя (не POST PARAMS)

POST /v1/customers/blahblah/delivery_quotes HTTP/1.1 
Host: api.postmates.com 
Authorization: Basic verysecure== 
User-Agent: Guzzle/5.2.0 curl/7.37.1 PHP/5.6.0 
Content-Length: 0 

и ответ

HTTP/1.1 400 BAD REQUEST 
Content-Type: application/json 
Date: Fri, 13 Feb 2015 07:32:16 GMT 
Server: nginx/1.1.19 
Content-Length: 205 
Connection: keep-alive 

{"kind": "error", "code": "invalid_params", "params": {"dropoff_address": "This field is required.", "pickup_address": "This field is required."}, "message": "The parameters of your request were invalid."} 

Так это выглядит как я аутентичности, но не проходит любые параметры сообщения. Я попытался использовать метод setPostField для установки полей POST без везения. Как я уже сказал, кажется, что в этом случае HTTP-запрос отправляется перед вызовом setPostField, в любом случае HTTP-запрос отправляется до того, как я позвоню send.

Я пробовал gzzlehttp/guzzle 5.2.0 и 5.0.0.

ответ

3

Ничего себе, похоже, я смотрел 2 документа документации, один для the newer GuzzleHttp\Client, один для the older Guzzle\Http\Client. Большая разница с новой библиотекой заключается в необходимости вызывать createRequest, если вы хотите отложить вызов HTTP-запроса.

Работа код под новую библиотеку

define('CUST_ID', 'blahblah'); 
define('API_KEY', 'verysecure'); 

// Construct the underlying Guzzle client 
$oClient = new GuzzleHttp\Client(
    ['base_url' => 
    ['http://api.postmates.com/{version}/', ['version' => 'v1']], 
    'defaults' => [ 
     // HTTP Basic auth header, username is api key, password is blank 
     'auth' => [API_KEY, ''], 
    ]]); 

// Create the request 
$oRq = $oClient->createRequest(
    'POST', 
    "customers/" . CUST_ID . "/delivery_quotes", 
    [ 'body' => 
     ['pickup_address' => '232 E Manhattan Ave, Denver, CO 80203', 
     'dropoff_address' => '4400 Midwest St, Denver, CO 80205']]); 

// Send the request 
$oRsp = $oClient->send($oRq);