গুজল 6: প্রতিক্রিয়াগুলির জন্য আর জাসন () পদ্ধতি নেই


172

পূর্বে গুজল 5.3 এ:

$response = $client->get('http://httpbin.org/get');
$array = $response->json(); // Yoohoo
var_dump($array[0]['origin']);

আমি খুব সহজেই একটি জেএসএন প্রতিক্রিয়া থেকে একটি পিএইচপি অ্যারে পেতে পারি। এখন গুজল 6 এ, আমি কীভাবে করব তা জানি না। মনে হয় আর কোনও json()পদ্ধতি নেই। আমি (দ্রুত) সর্বশেষ সংস্করণ থেকে দস্তাবেজটি পড়েছি এবং জেএসওএন প্রতিক্রিয়াগুলি সম্পর্কে কিছুই পাই না। আমি মনে করি আমি কিছু মিস করেছি, সম্ভবত এমন একটি নতুন ধারণা রয়েছে যা আমি বুঝতে পারি না (অথবা সম্ভবত আমি সঠিকভাবে পড়িনি)।

এই (নীচে) নতুন উপায় একমাত্র উপায়?

$response = $client->get('http://httpbin.org/get');
$array = json_decode($response->getBody()->getContents(), true); // :'(
var_dump($array[0]['origin']);

বা কোন সাহায্যকারী বা এরকম কিছু আছে?

উত্তর:


292

আমি json_decode($response->getBody())এখন পরিবর্তে ব্যবহার $response->json()

আমার সন্দেহ হয় এটি পিএসআর -7 কমপ্লায়েন্সের একটি দুর্ঘটনা হতে পারে।


4
ডকুমেন্টেশনের এমন কোনও কিছুই যা এটিকে স্পষ্ট করে না তবে এটি প্রদর্শিত হয় যে তারা $response->json()সাহায্যকারীকে পর্যায়ক্রমে ফেলেছে ।
পেপারক্লিপ

60
আপনি যদি আসলটি কীভাবে ->json()কাজ করেন তার মতো অ্যারে প্রতিক্রিয়া আশা করে থাকেন তবে json_decode($response->getBody(), true)স্টাডোবজেক্টের পরিবর্তে অ্যারে পেতে ব্যবহার করুন
জে এল-কাক

14
ব্যবহার করে strict_types, গুজলের প্রতিক্রিয়া বডিটি ডিকোড করার আগে আমাকে স্ট্রিংয়ে ফেলে দেওয়ার দরকার ছিল:json_decode((string) $response->getBody(), true)
ইওন টর্নেড

আমি সর্বদা ব্যবহার করতে পছন্দ করি \GuzzleHttp\json_decode(বা \GuzzleHttp\Utils::jsonDecodeআপনি যে গুজল সংস্করণে আছেন তার উপর নির্ভর করে) যার সাথে সামঞ্জস্যপূর্ণ স্বাক্ষর রয়েছে \json_decodeতবে সঠিক ত্রুটি হ্যান্ডলিংকে কাজে লাগিয়ে যদি কোনও ত্রুটি থাকে তবে ব্যতিক্রম ছুঁড়ে ফেলে।
অ্যাড্রিয়ান ফেডার

112

আপনি এতে স্যুইচ করুন:

json_decode($response->getBody(), true)

অন্য মন্তব্যগুলির পরিবর্তে যদি আপনি এটি করতে চান তবে অবজেক্টগুলির পরিবর্তে অ্যারে পেতে আগের মতো ঠিক কাজ করা উচিত।


29

আমি $response->getBody()->getContents()প্রতিক্রিয়া থেকে JSON পেতে ব্যবহার করি । গুজল সংস্করণ 6.3.0।


6
কলিং getContents()প্রতিক্রিয়া শরীরে স্ট্রীম এবং পরবর্তী কলে খালি হবে আজ getContents()খালি ফিরে আসবে। আপনি যদি শরীরটি স্ট্রিং ব্যবহার হিসাবে পেতে চান:strval($response->getBody())
জেভিটেলা

1
আমি আশা করি এই মন্তব্যটি আরও বেশি ছিল। আমি getContent ব্যবহার করে আমার প্রতিক্রিয়া লগ করছিলাম এবং পরে যখন আমি একটি লাইন পার্স করতে যাই, তখন আমার অ্যারেটি খালি ছিল। আমার কয়েক ঘন্টা খরচ। ধন্যবাদ!
কলিন

14

আপনি যদি এখনও আগ্রহী হন তবে গুজল মিডলওয়্যার বৈশিষ্ট্যের উপর ভিত্তি করে আমার কাজটি এখানে রইল :

  1. HTTP শিরোলেখ JsonAwaraResponseদ্বারা JSON প্রতিক্রিয়া ডিকোড করবে এমনটি তৈরি করুন Content-Type, যদি তা না হয় - এটি স্ট্যান্ডার্ড গুজল প্রতিক্রিয়া হিসাবে কাজ করবে:

    <?php
    
    namespace GuzzleHttp\Psr7;
    
    
    class JsonAwareResponse extends Response
    {
        /**
         * Cache for performance
         * @var array
         */
        private $json;
    
        public function getBody()
        {
            if ($this->json) {
                return $this->json;
            }
            // get parent Body stream
            $body = parent::getBody();
    
            // if JSON HTTP header detected - then decode
            if (false !== strpos($this->getHeaderLine('Content-Type'), 'application/json')) {
                return $this->json = \json_decode($body, true);
            }
            return $body;
        }
    }
  2. মিডলওয়্যার তৈরি করুন যা উপরের প্রতিক্রিয়া প্রয়োগের সাথে গুজল পিএসআর -7 প্রতিক্রিয়াগুলি প্রতিস্থাপন করবে:

    <?php
    
    $client = new \GuzzleHttp\Client();
    
    /** @var HandlerStack $handler */
    $handler = $client->getConfig('handler');
    $handler->push(\GuzzleHttp\Middleware::mapResponse(function (\Psr\Http\Message\ResponseInterface $response) {
        return new \GuzzleHttp\Psr7\JsonAwareResponse(
            $response->getStatusCode(),
            $response->getHeaders(),
            $response->getBody(),
            $response->getProtocolVersion(),
            $response->getReasonPhrase()
        );
    }), 'json_decode_middleware');

এরপরে JSON পুনরুদ্ধার করতে পিএইচপি নেটিভ অ্যারে হিসাবে গুজলটি বরাবরের মতো ব্যবহার করুন:

$jsonArray = $client->get('http://httpbin.org/headers')->getBody();

গুজলেহট্ট্প / গুজল 6.3.3 দিয়ে পরীক্ষিত


এটি কিছু ভাল জিনিস। একটি রেস্ট এপিআই ক্লায়েন্ট টাস্ক ব্যবহার করে যা আমি সবেমাত্র কাজ করে নিয়েছি। যদিও আপনার উত্তর সম্পর্কে আমার একটি প্রশ্ন আছে। আপনার JsonAwareResponse ক্লাসটি গুজলএইচটিটিপি নেমস্পেসের অন্তর্গত হওয়ার কথা ছিল? আমি কেবল নিজের নামের জায়গার অধীনে class ক্লাসটি তৈরি করে শেষ করেছি, তবে এক সেকেন্ডের জন্য আমি গুজলহ্যাট্পের কোডবেসটি class শ্রেণীর সন্ধানে খুঁজছিলাম। :) আবার ধন্যবাদ!
মেঝেতে

এই সমাধানটি ব্যবহার করবেন না কারণ এটি পিএসআর -7 ইন্টারফেসটি ভঙ্গ করে MessageInterface। পিএসআর -7 এর সাথে getBody()পদ্ধতি থেকে ডিকোড জেএসএনকে ফিরিয়ে আনার জন্য এই ইন্টারফেসটি প্যাচ করার কোনও আইনি সমাধান নেই ।
সের্গে নেভমারজিটস্কি

3

$responsePSR-7 এর উদাহরণ ResponseInterface। আরও তথ্যের জন্য https://www.php-fig.org/psr/psr-7/#3-interfaces দেখুন

getBody()ফেরত StreamInterface:

/**
 * Gets the body of the message.
 *
 * @return StreamInterface Returns the body as a stream.
 */
public function getBody();

StreamInterface__toString()যা প্রয়োগ করে

শুরু থেকে শেষ পর্যন্ত স্ট্রিম থেকে সমস্ত ডেটা স্ট্রিংয়ে পড়ে।

সুতরাং, শরীরকে স্ট্রিং হিসাবে পড়তে আপনাকে এটিকে স্ট্রিংয়ে ফেলে দিতে হবে:

$stringBody = (string) $response->getBody()


Gotchas

  1. json_decode($response->getBody()এটি সর্বোত্তম সমাধান নয় কারণ এটি জাদুকরভাবে আপনার জন্য স্ট্রিংয়ে প্রবাহিত করে। json_decode()প্রথম আর্গুমেন্ট হিসাবে স্ট্রিংয়ের প্রয়োজন।
  2. $response->getBody()->getContents()আপনি কী করছেন তা না জানলে ব্যবহার করবেন না । তোমার জন্য ডকুমেন্টেশন পড়ুন getContents(), এটা বলেন: Returns the remaining contents in a string। অতএব, কলিংটি getContents()স্ট্রিমের বাকী অংশগুলি পড়ে এবং এটিকে আবার কল করা কিছুই দেয় না কারণ স্ট্রিম ইতিমধ্যে শেষ। আপনাকে সেই কলগুলির মধ্যে স্ট্রিমটি রিওয়াইন্ড করতে হবে।

1

যোগ করা ->getContents()jSON প্রতিক্রিয়া ফেরায় না, পরিবর্তে এটি পাঠ্য হিসাবে ফিরে আসে।

আপনি সহজভাবে ব্যবহার করতে পারেন json_decode


এটি জেএসনকে HTML হিসাবে নয়, পাঠ্য হিসাবে ফেরত দেয়।
6:38 এ ফ্রাঙ্কটিক মাšা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.