JSON में POST अनुरोध भेजने के लिए मैं Guzzle का उपयोग कैसे कर सकता हूं?


180

किसी को भी postJSON का उपयोग करने का सही तरीका पता है Guzzle?

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

मुझे internal server errorसर्वर से प्रतिक्रिया मिलती है। यह क्रोम का उपयोग करके काम करता है Postman


अनुरोध ठीक लगता है ... क्या आपने $ _POST की सामग्री की जाँच की है यह सुनिश्चित करने के लिए कि क्या आप वास्तव में उन्हें एन्कोडिंग करने से पहले मान प्राप्त करते हैं? : var_dump ($ _ POST)
यलरजेन

डॉक्स के अनुसार, अब आप केवल @davykiash ने जो कहा है, उसका उपयोग कर सकते हैं 'json' => $data: stackoverflow.com/a/44154428/842768
giovannipds

जवाबों:


262

के लिए guzzle 5, 6 और 7 आप इसे इस प्रकार है:

use GuzzleHttp\Client;

$client = new Client();

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

डॉक्स


13
यह करने का सही तरीका है ( आधिकारिक उदाहरण यहां )
पियरे डे लेसपिन

5
यह RequestOptionsविकल्प सरणी कुंजियों ( GuzzleHttp\RequestOptions::JSONइस मामले में) के लिए स्थिरांक का उपयोग करने की सिफारिश की जाती है - यह टाइपोस को आसानी से पता लगाता है क्योंकि वे परेशानी पैदा करने की प्रतीक्षा कर रहे मौन कीड़े के बजाय अचानक नोटिस बन जाते हैं।
ksadowski

7
@ मिचलगलोविक यह एक ही है। निरंतर उपयोग करने का उद्देश्य टाइपोस से बचना है। एक निरंतर का उपयोग करना जो मौजूद नहीं है, एक त्रुटि उठाएगा, लेकिन एक बेकार विकल्प ( jssonउदाहरण के लिए) भेजने से कोई त्रुटि नहीं उठेगी, और आपको अपना टाइपो खोजने में कुछ समय लग सकता है।
zessx

1
मैं इस जवाब के लिए एक घंटे के लिए चारों ओर देख रहा था। यह दस्तावेज़ीकरण (विशेष रूप से त्वरित सेटअप गाइड) में क्यों नहीं है? पागल!?!
सेवंथर्स

1
@giovannipds GuzzleHttp \ RequestOptions :: JSON 'json' के लिए एक उपनाम है, या तो ठीक है।
मिशाल गैलोविक

44

के लिए guzzle <4 = :

यह एक कच्चा पोस्ट अनुरोध है, ताकि शरीर में JSON को डालने से समस्या हल हो जाए

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

return $response;

8
यह अब गुज़लेहटप के साथ काम नहीं करता है। @ शर्ली का सही जवाब है
hbt

मुझे लगता है कि हमें केवल प्रश्न में गज़ल के संस्करण को निर्दिष्ट करने की आवश्यकता है।
फेब्रिस कबोंगो

1
यदि आप Guzzle 6 में कंटेंट टाइप हेडर सेट करना चाहते हैं, तो आप इसे इस तरह कर सकते हैं:$client->post($url, ['body' => $string, 'headers' => ['Content-type' => 'application/json']]);
marcovtwout

मैंने गुज़ेले 3 के साथ ऐसा करने की कोशिश की है, भले ही वह डॉक में बताए गए तरीके से काम नहीं कर रहा हो: guzzle3.readthedocs.io/http-client/… , यह 2 दिन का है, मैं इस पी.बी. को हल करने की कोशिश कर रहा हूँ लेकिन व्यर्थ
हैनेन

डॉक्स के अनुसार अब, आप केवल वही उपयोग कर सकते हैं जो @davykiash ने कहा था, 'json' => $data: stackoverflow.com/a/44154428/842768
giovannipds

42

सरल और बुनियादी तरीका (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>';

2
यह वास्तव में एक सरल और आसान तरीका है। शरीर और हेडर सेट करने के बारे में मेरी समस्या का समाधान किया। बहुत बहुत धन्यवाद
फैसल सरफराज

यह उत्तर मेरे लिए काम करता है जब स्वीकृत उत्तर नहीं होता है।
vietnguyen09

32

यह मेरे लिए काम किया (गज़ले 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());

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
क्या यह सही हेडर भी सेट करता है? मुझे लगता ['json' => $body]है कि यहां बेहतर तरीका है, जैसा कि माइकल के जवाब से बताया गया है।
जेक

1
$res->json();केवल गुज़ल 5.3 में काम करता है। इसे v6 में हटा दिया गया है।
डेविड

1
डेविड सही है। यह PSR-7 के कार्यान्वयन के कारण है। json_decode()इसके बजाय उपयोग करें ।
एंड्रियास

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

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

return $response->getBody();

8

यह मेरे लिए गुज़ेले 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 करते हैं



2

पीएचपी संस्करण: 5.6

सिम्फनी संस्करण: 2.3

गज़ल: 5.0

मुझे हाल ही में गज़ल के साथ जसन भेजने के बारे में एक अनुभव मिला। मैं सिम्फनी 2.3 का उपयोग करता हूं, इसलिए मेरा गज़ल संस्करण थोड़ा पुराना हो सकता है।

मैं यह भी दिखाऊंगा कि डिबग मोड का उपयोग कैसे करें और आप इसे भेजने से पहले अनुरोध देख सकते हैं,

जब मैंने अनुरोध किया, जैसा कि नीचे दिखाया गया है, को सफल प्रतिक्रिया मिली;

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 से जवाब $dataइस प्रकार काम करके बनाया जा सकता है:

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

हमारी परियोजना को जोस स्ट्रिंग के अंदर एक सरणी में एक चर सम्मिलित करने की आवश्यकता थी, जो मैंने निम्नानुसार किया था (यदि यह किसी को भी मदद करता है):

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

तो $existing_variable, 90210 के साथ, आप प्राप्त करते हैं:

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

यह भी ध्यान देने योग्य है कि आप 'Accept' => 'application/json'उस तरह की चीज़ के बारे में परवाह करने के मामले में भी साथ ही साथ सेट करना चाहते हैं ।


बस एक सिर ... आप $dataका उपयोग करके अपने सरलीकृत कर सकते हैं json_encode:$data = json_encode(array('collection' => $existing_variable));
phpisuber01

0

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

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

--- समाधान के लिए * गुझेल 6 * --- -पैकेज है कि आप की जरूरत है:

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

धन्यवाद। विरासत php5.3 परियोजनाओं के लिए कहीं और कोई भी guzzle3 समाधान नहीं मिल सका, यह देखना चाहेंगे कि यह आपके guzzle6 की तरह लाइन-ब्रेक चाहेगा क्योंकि यह मुझे समय की एक बहुत कुछ बचा होगा।
taur

0

ऊपर के जवाबों ने मेरे लिए किसी तरह काम नहीं किया। लेकिन यह मेरे लिए ठीक काम करता है।

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

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

0

बस इसका उपयोग करें यह काम करेगा

   $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();
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.