wake-up-neo.com

Wie kann ich mit Guzzle a POST Anfrage in JSON?

Kennt jemand den korrekten Weg zu post JSON mit Guzzle?

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

Ich bekomme eine internal server error-Antwort vom Server. Es funktioniert mit Chrome Postman.

135
user3379466

Für Guzzle <= 4 :

Es ist eine rohe Post-Anfrage, also löste das JSON-Problem das Problem, indem man den JSON in den Körper setzte

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

return $response;
38
user3379466

Für Guzzle 5 & 6 machen Sie es so:

use GuzzleHttp\Client;

$client = new Client();

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

Dokumente

189
Michal Gallovic

Der einfache und grundlegende Weg (guzzle6):

$client = new Client([
    'headers' => [ 'Content-Type' => 'application/json' ]
]);

$response = $client->post('http://api.com/CheckItOutNow',
    ['body' => json_encode(
        [
            'hello' => 'World'
        ]
    )]
);

Um den Antwortstatuscode und den Inhalt des Körpers zu erhalten, habe ich Folgendes gemacht:

echo '<pre>' . var_export($response->getStatusCode(), true) . '</pre>';
echo '<pre>' . var_export($response->getBody()->getContents(), true) . '</pre>';
29
Frank Roth
$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();
23
CharlieJade

Das hat für mich funktioniert (mit 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());
19
davykiash

Das funktioniert für mich mit 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')
                                )
                    );

Laut Dokumentation muss der json_encode gemacht werden 

6
arcos.lwm
$client = new \GuzzleHttp\Client(['base_uri' => 'http://example.com/api']);

$response = $client->post('/save', [
    'json' => [
        'name' => 'John Doe'
    ]
]);

return $response->getBody();
3
Yamen Ashraf

@ user3379466 ist korrekt, aber hier schreibe ich vollständig um:

-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('[email protected]', 'password', 'Digest'),)));

$url          = "https://api.yourbaseapiserver.com/incidents.xml";
        
$data = '<incident>
<name>Incident Title2a</name>
<priority>Medium</priority>
<requester><email>[email protected]</email></requester>
<description>description2a</description>
</incident>';

    $request = $client->post($url, array('content-type' => 'application/xml',));

    $request->setBody($data); #set body! this is body of request object and not a body field in the header section so don't be confused.

    $response = $request->send(); #you must do send() method!
    echo $response->getBody(); #you should see the response body from the server on success
    die;

--- Lösung für * Guzzle 6 * ---- Paket, das Sie benötigen:

 "require": {
    "php"  : ">=5.5.0",
    "guzzlehttp/guzzle": "~6.0"
},

$client = new Client([
                             // Base URI is used with relative requests
                             'base_uri' => 'https://api.compay.com/',
                             // You can set any number of default request options.
                             'timeout'  => 3.0,
                             'auth'     => array('[email protected]', 'dsfddfdfpassword', 'Digest'),
                             'headers' => array('Accept'        => 'application/vnd.comay.v1.1+xml',
                                                'Content-Type'  => 'text/xml'),
                         ]);

$url = "https://api.compay.com/cases.xml";
    $data string variable is defined same as above.


    // Provide the body as a string.
    $r = $client->request('POST', $url, [
        'body' => $data
    ]);

    echo $r->getBody();
    die;
0
Dung
use GuzzleHttp\Client;

$client = new Client();

$response = $client->post('url', [
    'json' => ['foo' => 'bar']
]);

Siehe Docs .

0
Nurul Huda

Verwenden Sie einfach dieses, es wird funktionieren

   $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();
0
user5948411

Die obigen Antworten haben bei mir irgendwie nicht funktioniert. Aber das funktioniert gut für mich.

 $client = new Client('' . $appUrl['scheme'] . '://' . $appUrl['Host'] . '' . $appUrl['path']);

 $request = $client->post($base_url, array('content-type' => 'application/json'), json_encode($appUrl['query']));
0
Suraj

Die Antwort von @ user3379466 kann durch Setzen von $data wie folgt ausgeführt werden:

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

Was wir für unser Projekt benötigten, war das Einfügen einer Variablen in ein Array innerhalb des Json-Strings. Dies tat ich wie folgt (falls dies jedem hilft) 

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

Wenn $existing_variable beispielsweise 90210 ist, erhalten Sie:

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

Erwähnenswert ist auch, dass Sie auch den 'Accept' => 'application/json' setzen möchten, falls der Endpunkt, den Sie treffen, sich für diese Art von Dingen interessiert.

0
j boschiero