JSON'da POST isteği göndermek için Guzzle'ı nasıl kullanabilirim?


180

Herkes postJSON kullanarak doğru yolu biliyor mu Guzzle?

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

internal server errorSunucudan bir yanıt alıyorum . Chrome kullanarak çalışır Postman.


İstek iyi görünüyor ... $ _POST içeriğini, kodlamadan önce değerleri gerçekten aldığınızdan emin olmak için kontrol ettiniz mi? : var_dump ($ _ POST)
ylerjen

Artık dokümanlara göre, @davykiash'in söylediklerini kullanabilirsiniz 'json' => $data: stackoverflow.com/a/44154428/842768
giovannipds

Yanıtlar:


262

For guzzle 5, 6 ve 7 bunu şöyle yapın:

use GuzzleHttp\Client;

$client = new Client();

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

Dokümanlar


13
Bunu yapmanın doğru yolu budur ( resmi örnek burada )
Pierre de LESPINAY

5
RequestOptionsSeçenekler dizisi anahtarları için sabitlerin kullanılması önerilir ( GuzzleHttp\RequestOptions::JSONbu durumda), yazım hatalarının fark edilmesini bekleyen sessiz hatalar yerine aniden bildirim haline geldiklerinden algılanmayı kolaylaştırır.
ksadowski

7
@MichalGallovic Aynı. Sabiti kullanmanın amacı yazım hatalarından kaçınmaktır. Varolmayan bir sabit kullanmak bir hatayı yükseltir, ancak işe yaramaz bir seçenek göndermek ( jssonörneğin , olduğu gibi) herhangi bir hatayı artırmaz ve yazım hatalarınızı bulmak için biraz zaman ayırabilirsiniz.
zessx

1
Bu cevap için bir saat arıyordum. Bu neden belgelerde yok (özellikle hızlı kurulum kılavuzu)? Çılgın!?!
Yedi Yıl

1
@giovannipds GuzzleHttp \ RequestOptions :: JSON, 'json' için bir takma addır, ya da iyidir.
Michal Gallovic

44

İçin guzzle <4 = :

Bu ham bir mesaj isteği, bu yüzden JSON'u vücuda koymak sorunu çözdü

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

return $response;

8
Bu artık GuzzleHttp ile çalışmaz. @Charlie doğru cevap var
hbt

Bence sadece soruda Guzzle sürümünü belirtmemiz gerekiyor.
Fabrice Kabongo

1
Guzzle 6'da içerik türü başlığını ayarlamak istiyorsanız, bunu şu şekilde yapabilirsiniz:$client->post($url, ['body' => $string, 'headers' => ['Content-type' => 'application/json']]);
marcovtwout

Bunu Guzzle3 ile denedim, dokümanda belirtilen yol olsa bile çalışmıyor: guzzle3.readthedocs.io/http-client/… , bu pb'yi çözmeye çalışıyorum 2 gün oldu ama boşuna
Hanane

Artık dokümanlara göre, @davykiash'in söylediklerini kullanabilirsiniz 'json' => $data: stackoverflow.com/a/44154428/842768
giovannipds

42

Basit ve temel yol (guzzle6):

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

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

Yanıt durum kodunu ve vücudun içeriğini almak için şunu yaptım:

echo '<pre>' . var_export($response->getStatusCode(), true) . '</pre>';
echo '<pre>' . var_export($response->getBody()->getContents(), true) . '</pre>';

2
Bu gerçekten basit ve kolay bir yol. Gövde ve başlıkları ayarlama ile ilgili sorunumu çözdüm Çok teşekkürler
Faisal Sarfraz

Bu cevap kabul edilen cevap olmadığında benim için işe yarar.
1919

32

Bu benim için çalıştı (Guzzle 6 kullanarak)

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

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

2
Bu da doğru başlığı ayarlıyor mu? Bence ['json' => $body]Michael'ın cevabında da belirtildiği gibi burada daha iyi bir yol var.
Ja͢ck

1
$res->json();sadece Guzzle 5.3'te çalışır. Sürüm 6'da kaldırıldı.
David

1
David haklı. Bunun nedeni PSR-7 uygulamasıdır. json_decode()Bunun yerine kullanın .
Andreas,

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

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

return $response->getBody();

8

Bu benim için Guzzle 6.2 ile çalışır:

$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')
                                )
                    );

Belgelere göre guzzle json_encode


7
use GuzzleHttp\Client;

$client = new Client();

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

Bkz. Dokümanlar .


2

Php Sürümü: 5.6

Symfony sürümü: 2.3

Ağlama: 5.0

Son zamanlarda Guzzle ile json gönderme konusunda bir deneyim yaşadım. Symfony 2.3 kullanıyorum, bu yüzden guzzle versiyonum biraz daha eski olabilir.

Ayrıca hata ayıklama modunun nasıl kullanılacağını göstereceğim ve isteği göndermeden önce görebilirsiniz,

Aşağıda gösterildiği gibi istek yaptığımda başarılı yanıt var;

use GuzzleHttp\Client;

$headers = [
        'Authorization' => 'Bearer ' . $token,        
        'Accept'        => 'application/json',
        "Content-Type"  => "application/json"
    ];        

    $body = json_encode($requestBody);

    $client = new Client();    

    $client->setDefaultOption('headers', $headers);
    $client->setDefaultOption('verify', false);
    $client->setDefaultOption('debug', true);

    $response = $client->post($endPoint, array('body'=> $body));

    dump($response->getBody()->getContents());

0

@ User3379466 tarafından verilen yanıt $dataaşağıdaki gibi ayarlanarak işe yarayabilir :

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

Projemizin ihtiyaç duyduğu şey, aşağıdaki gibi yaptığım json dizesinin içindeki bir diziye bir değişken eklemekti (bu kimseye yardımcı olursa):

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

Yani $existing_variable90210 olmakla şunları elde edersiniz:

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

Ayrıca dikkat etmeniz 'Accept' => 'application/json'gereken şey, vurduğunuz uç noktanın bu tür bir şeyle ilgilenmesi durumunda da ayarlamak isteyebilirsiniz .


Sadece bir kafaları yukarı ... Sizin kolaylaştırabilirsiniz $datakullanarak json_encode:$data = json_encode(array('collection' => $existing_variable));
phpisuber01

0

@ user3379466 doğru, ama burada tam olarak yeniden yazıyorum:

-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>';

    $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;

--- çözüm * Guzzle 6 * ---- paket ihtiyacınız:

 "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('you@gmail.ca', '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;

Teşekkür ederim. Eski php5.3 projeleri için başka bir yerde herhangi bir guzzle3 çözümü bulamadım, bana çok zaman kazandıracaktı çünkü guzzle6 gibi hat-break'd görmek istiyorum.
taur

0

Yukarıdaki cevaplar bir şekilde benim için işe yaramadı. Ama bu benim için iyi çalışıyor.

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

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

0

Sadece bunu kullanacak

   $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();
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.