2015-06-27 2 views
3

Это должно быть просто, но я потратил часы на поиск ответа и действительно застрял. Я создаю базовое приложение Laravel и использую Guzzle для замены запроса CURL, который я делаю на данный момент. Все функции CURL используют необработанные переменные JSON в теле.Можете ли вы включить сырой JSON в Body POST Body?

Я пытаюсь создать рабочий клиент Guzzle, но сервер переписывается с «недопустимым запросом», и мне просто интересно, происходит ли что-то подозрительное с JSON, которое я публикую. Я начинаю задаваться вопросом, не можете ли вы использовать необработанный JSON в теле запроса запроса Guzzle POST? Я знаю, что заголовки работают, так как я получаю действительный ответ от сервера, и я знаю, что JSON действителен, так как он в настоящее время работает в запросе CURL. Так что я застрял :-(

Любая помощь будет ооочень высоко оценен.

 $headers = array(
      'NETOAPI_KEY' => env('NETO_API_KEY'), 
      'Content-Type' => 'application/json', 
      'Accept' => 'application/json', 
      'NETOAPI_ACTION' => 'GetOrder' 
     ); 

    // JSON Data for API post 
    $GetOrder = '{ 
     "Filter": { 
      "OrderID": "N10139", 
       "OutputSelector": [ 
        "OrderStatus" 
       ] 
     } 
    }'; 

    $client = new client(); 
    $res = $client->post(env('NETO_API_URL'), [ 'headers' => $headers ], [ 'body' => $GetOrder ]); 

    return $res->getBody(); 
+0

Эй, ребята. Спасибо за быстрый ответ. Я закончил тем, что понял, что я затормаживаю, и имел заголовки и тело в отдельных массивах. Изменено: ['headers' => $ headers], ['body' => $ GetOrder] К этому: ['headers' => $ headers, 'body' => $ GetOrder] –

+0

Несмотря на это, вы могли бы использовать опцию «json», как показано в моем ответе; это упрощает некоторые вещи. –

+0

Спасибо, Джек. Это был полезный ответ, но у меня много звонков с очень длинными запросами JSON, и я не хочу, чтобы их преобразовывать в PHP, чтобы использовать функцию json. –

ответ

12

Вы можете отправить регулярный массив в формате JSON через 'json' request option, это будет также автоматически установить правильные заголовки:

$headers = [ 
    'NETOAPI_KEY' => env('NETO_API_KEY'), 
    'Accept' => 'application/json', 
    'NETOAPI_ACTION' => 'GetOrder' 
]; 

$GetOrder = [ 
    'Filter' => [ 
     'OrderID' => 'N10139', 
     'OutputSelector' => ['OrderStatus'], 
    ], 
]; 

$client = new client(); 
$res = $client->post(env('NETO_API_URL'), [ 
    'headers' => $headers, 
    'json' => $GetOrder, 
]); 
+0

Спасибо Джейку. Оно работает! –

0

Вы, вероятно, нужно установить тип тела мим. Это можно легко сделать с помощью метода setBody().

$request = $client->post(env('NETO_API_URL'), ['headers' => $headers]); 
$request->setBody($GetOrder, 'application/json');