GuzzleHttp - исключение ошибки 400, но при этом curl работает отлично

Я вызываю сторонний API для отдыха с помощью GuzzleHttp, но он каждый раз выдает 400 неверных запросов.

Среда разработки:

  1. Фреймворк Laravel / PHP
  2. Версия Guzzle в файле composer.json - guzzlehttp / guzzle: ^ 6.3
  3. Ubuntu 16.04 LTS

Обращение к URL с данными:

try{

$client = new \GuzzleHttp\Client();

$res= $client->request('post',
            env('FLIGHT_API').'FlightSearch',
            ['headers' => ['Content-Type' => 'application/json' , 'Accept' => 'application/json'],'form_params' => $body]);

}catch (ClientException $e){



        $response['status'] = false;
        $response['message'] = $e->getMessage().$e->getCode();

        return $response;

    }

Ответ жрать:

{
"status": false,
"message": "Client error: `POST http://stagingapi.trip.com/Search` resulted in a `400 Bad Request` response:\n\ufeff<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3 (truncated...)\n400"
}

Итак, наконец, я попробовал тот же API с curl, и он отлично работает и дает результат.

Код Curl с URL и данными:

$curl = curl_init();

        curl_setopt_array($curl, array(
            CURLOPT_URL => env('FLIGHT_API').'FlightSearch',
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_ENCODING => "",
            CURLOPT_MAXREDIRS => 10,
            CURLOPT_TIMEOUT => 30,
            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
            CURLOPT_CUSTOMREQUEST => "POST",
            CURLOPT_POSTFIELDS => json_encode($body),
            CURLOPT_HTTPHEADER => array(
                "cache-control: no-cache",
                "content-type: application/json",
                "Accept: application/json"
            ),
        ));

        $response = curl_exec($curl);
        //return $response;
        $err = curl_error($curl);

        curl_close($curl);

        if($response){

            return json_decode($response , true);

        }

        return $err;

Как определить причину неисправности?


person Dhaval    schedule 03.11.2017    source источник


Ответы (1)


Тебе нужно

'json' => $body

вместо того

'form_params' => $body
person Alexey Shokov    schedule 04.11.2017
comment
это работает для меня, но можете ли вы сказать мне, в чем разница между 'fomr_params' и 'json'? и в каком состоянии можно использовать какой? - person Dhaval; 06.11.2017
comment
Это описано в документации. forms_params - отправка HTML-форм, json - отправка JSON. - person Alexey Shokov; 06.11.2017