Как я могу использовать Guzzle для отправки запроса POST в JSON?

Кто-нибудь знает правильный способ post JSON с использованием Guzzle ?

 $request = $this->client->post(self::URL_REGISTER,array( 'content-type' => 'application/json' ),array(json_encode($_POST))); 

Я получаю сообщение internal server error с сервера. Он работает с помощью Chrome Postman .

Для Guzzle 5 & 6 вы делаете это так:

 use GuzzleHttp\Client; $client = new Client(); $response = $client->post('url', [ GuzzleHttp\RequestOptions::JSON => ['foo' => 'bar'] ]); 

Документы

Для Guzzle <= 4 :

Это необработанный запрос, поэтому установка JSON в корпус решила проблему

 $request = $this->client->post($url,array( 'content-type' => 'application/json' ),array()); $request->setBody($data); #set body! $response = $request->send(); return $response; 

Простой и простой способ (guzzle6):

 $client = new Client([ 'headers' => [ 'Content-Type' => 'application/json' ] ]); $response = $client->post('http://api.com/CheckItOutNow', ['body' => json_encode( [ 'hello' => 'World' ] )] ); 

Чтобы получить код статуса ответа и содержимое тела, я сделал следующее:

 echo '<pre>' . var_export($response->getStatusCode(), true) . '</pre>'; echo '<pre>' . var_export($response->getBody()->getContents(), true) . '</pre>'; 
 $client = new \GuzzleHttp\Client(); $body['grant_type'] = "client_credentials"; $body['client_id'] = $this->client_id; $body['client_secret'] = $this->client_secret; $res = $client->post($url, [ 'body' => json_encode($body) ]); $code = $res->getStatusCode(); $result = $res->json(); 

Это сработало для меня (используя Guzzle 6)

 $client = new Client(); $result = $client->post('http://api.example.com', [ 'json' => [ 'value_1' => 'number1', 'Value_group' => array("value_2" => "number2", "value_3" => "number3") ] ]); echo($result->getBody()->getContents()); 

Это работает для меня с Guzzle 6.2:

 $gClient = new \GuzzleHttp\Client(['base_uri' => 'www.foo.bar']); $res = $gClient->post('ws/endpoint', array( 'headers'=>array('Content-Type'=>'application/json'), 'json'=>array('someData'=>'xxxxx','moreData'=>'zzzzzzz') ) ); 

Согласно документации, жужжайте json_encode

Ответ от пользователя @ user3379466 можно заставить работать, установив $data следующим образом:

 $data = "{'some_key' : 'some_value'}"; 

Нам нужно было вставить переменную в массив внутри json-строки, что я сделал следующим образом (в случае, если это помогает кому-либо):

 $data = "{\"collection\" : [$existing_variable]}"; 

Таким образом, с $existing_variable , например, 90210, вы получаете:

 echo $data; //{"collection" : [90210]} 

Также стоит отметить, что вы также захотите установить 'Accept' => 'application/json' а также в случае, если конечная точка, с которой вы стреляете, заботится о таких вещах.

Выше ответы не работали для меня как-то. Но это отлично работает для меня.

  $client = new Client('' . $appUrl['scheme'] . '://' . $appUrl['host'] . '' . $appUrl['path']); $request = $client->post($base_url, array('content-type' => 'application/json'), json_encode($appUrl['query'])); 

Просто используйте это, он будет работать

  $auth = base64_encode('user:'.config('mailchimp.api_key')); //API URL $urll = "https://".config('mailchimp.data_center').".api.mailchimp.com/3.0/batches"; //API authentication Header $headers = array( 'Accept' => 'application/json', 'Authorization' => 'Basic '.$auth ); $client = new Client(); $req_Memeber = new Request('POST', $urll, $headers, $userlist); // promise $promise = $client->sendAsync($req_Memeber)->then(function ($res){ echo "Synched"; }); $promise->wait(); 

@ user3379466 верен, но здесь я переписываю полностью:

 -package that you need: "require": { "php" : ">=5.3.9", "guzzlehttp/guzzle": "^3.8" }, -php code (Digest is a type so pick different type if you need to, i have to include api server for authentication in this paragraph, some does not need to authenticate. If you use json you will need to replace any text 'xml' with 'json' and the data below should be a json string too): $client = new Client('https://api.yourbaseapiserver.com/incidents.xml', array('version' => 'v1.3', 'request.options' => array('headers' => array('Accept' => 'application/vnd.yourbaseapiserver.v1.1+xml', 'Content-Type' => 'text/xml'), 'auth' => array('username@gmail.com', 'password', 'Digest'),))); 
 $url = "https://api.yourbaseapiserver.com/incidents.xml"; $data = '<incident> <name>Incident Title2a</name> <priority>Medium</priority> <requester><email>dsss@mail.ca</email></requester> <description>description2a</description> </incident>';