আমি কীভাবে গুজলকে JSON এ একটি পোষ্ট অনুরোধ প্রেরণ করতে পারি?


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 ($ _ পোষ্ট)
ইলার্জেন

এখন দস্তাবেজ অনুযায়ী, আপনি শুধু ব্যবহার করতে পারেন @davykiash কি বললেন, 'json' => $data: stackoverflow.com/a/44154428/842768
giovannipds

উত্তর:


261

জন্য মদ্যপানোত্সব 5 & 6 আপনি এটা ভালো একটি করুন:

use GuzzleHttp\Client;

$client = new Client();

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

ডক্স



5
RequestOptionsবিকল্প অ্যারে কীগুলির জন্য ধ্রুবক ব্যবহার করার পরামর্শ দেওয়া হয় ( GuzzleHttp\RequestOptions::JSONএই ক্ষেত্রে) - এটি টাইপগুলি সনাক্ত করতে আরও সহজ করে তোলে কারণ তারা সমস্যার জন্য অপেক্ষা করার জন্য কেবল নিঃশব্দ বাগগুলির পরিবর্তে হঠাৎ বিজ্ঞপ্তি হয়ে যায়।
ksadowski

7
@ মিচালগ্যালোভিক এটি একই রকম। ধ্রুবকটি ব্যবহারের উদ্দেশ্য টাইপস এড়ানো avoid অস্তিত্ব নেই এমন একটি ধ্রুবক ব্যবহার করা ত্রুটি বাড়িয়ে তুলবে, তবে অকেজো বিকল্পটি ( jssonউদাহরণস্বরূপ) প্রেরণ কোনও ত্রুটি বাড়িয়ে তুলবে না এবং আপনার টাইপগুলি খুঁজে পেতে আপনার কিছুটা সময় লাগতে পারে।
জেসেক্স

1
আমি এই উত্তরের জন্য প্রায় এক ঘন্টা খুঁজছিলাম was কেন এটি ডকুমেন্টেশনে নেই (বিশেষত দ্রুত সেটআপ গাইড)? ক্রেজি!?!
সিভিনিয়ার্থস

1
@giovannipds গুজলএইচটিটিপি est রিকোয়েস্টঅ্যাপশনস :: জেএসএন 'জসন' এর একটি উপনাম, হয় ঠিক আছে।
মিশাল গ্যাল্লোভিক

44

জন্য মদ্যপানোত্সব <4 = :

এটি একটি কাঁচা পোস্ট অনুরোধ তাই JSON দেহে রেখে সমস্যার সমাধান করুন

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

return $response;

8
এটি আর গুজলহট্টের সাথে কাজ করে না। @ চার্লি এর সঠিক উত্তর আছে
এইচবিটি

আমি মনে করি আমাদের প্রশ্নের মধ্যে গুজলের সংস্করণটি নির্দিষ্ট করা দরকার।
ফ্যাব্রিস কাবঙ্গো

আপনি যদি গুজল 6 এ বিষয়বস্তুর ধরণের শিরোনাম সেট করতে চান তবে আপনি এটি এর মতো করতে পারেন:$client->post($url, ['body' => $string, 'headers' => ['Content-type' => 'application/json']]);
মার্চভ্টওয়াত

আমি গুজল 3 এর সাথে এটি চেষ্টা করেছি ডকটিতে উল্লিখিত পদ্ধতি অনুসারে কাজ করছে না: guzzle3.readthedocs.io/http-client/… , 2 দিন হয়ে গেছে আমি এই পিবি সমাধান করার চেষ্টা করছি তবে বৃথা
হানানে

এখন দস্তাবেজ অনুযায়ী, আপনি শুধু ব্যবহার করতে পারেন @davykiash কি বললেন, 'json' => $data: stackoverflow.com/a/44154428/842768
giovannipds

42

সহজ এবং মৌলিক উপায় (গুজল 6):

$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
এটি সত্যিই একটি সহজ এবং সহজ উপায়। বডি এবং শিরোনাম স্থাপন সম্পর্কে আমার সমস্যা সমাধান করুন। অনেক অনেক ধন্যবাদ
ফয়সাল সরফরাজ

যখন উত্তর গৃহীত উত্তর না দেয় তখন এই উত্তরটি আমার পক্ষে কাজ করে।
ভিটেনগুইন09

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]মতে মাইকেল এর উত্তর দ্বারা উল্লিখিত হিসাবে এখানে ভাল উপায়।
Ja͢ck

1
$res->json();শুধুমাত্র গুজল 5.3 এ কাজ করে। এটি v6-এ সরানো হয়েছে।
ডেভিড

1
ডেভিড ঠিক আছে। এটি পিএসআর -7 বাস্তবায়নের কারণে। json_decode()পরিবর্তে ব্যবহার করুন।
Andreas


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

সিমফনি সংস্করণ: ২.৩

গুজল: 5.0

গুজলের সাথে জসন প্রেরণ সম্পর্কে সম্প্রতি আমার একটি অভিজ্ঞতা ছিল। আমি সিমফনি ২.৩ ব্যবহার করি যাতে আমার গুজল সংস্করণটি আরও পুরানো হতে পারে।

আমি কীভাবে ডিবাগ মোড ব্যবহার করব তাও দেখাব এবং অনুরোধটি প্রেরণের আগে আপনি এটি দেখতে পারেন,

যখন আমি অনুরোধটি করেছি নীচে প্রদর্শিত হয়েছে সাফল্যের সাড়া পেয়েছে;

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

@ ব্যবহারকারীর 337979466 এর উত্তর নীচে সেট করে কাজটি করা যেতে পারে $data:

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

আমাদের প্রকল্পের যা দরকার তা হ'ল জসন স্ট্রিংয়ের অভ্যন্তরে একটি অ্যারেতে একটি ভেরিয়েবল সন্নিবেশ করানো, যা আমি নীচে করেছিলাম (যদি এটি কাউকে সহায়তা করে):

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

সুতরাং $existing_variableসত্তার সাথে , 90210 বলুন, আপনি পাবেন:

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

লক্ষ্য করার মতো বিষয় হ'ল আপনি 'Accept' => 'application/json'যে ধরণের জিনিসটির দিকে মনোযোগ দিচ্ছেন সে ক্ষেত্রে আপনি শেষটিও সেট করতে চান want


মাত্র একটি মাথা আপ ... আপনি $dataব্যবহার করে json_encode$data = json_encode(array('collection' => $existing_variable));
এটিকে আরও

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

-1

@ ব্যবহারকারী 3379466 সঠিক, তবে এখানে আমি পুরোপুরি আবার লিখি:

-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;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.