গুজলহট্টপ - গুজল 6 এর প্রতিক্রিয়াটির শরীর কীভাবে পাবেন?


163

আমি আমার অ্যাপ্লিকেশনটি বিকাশ করছে এমন একটি এপিআই জুড়ে একটি মোড়ক লেখার চেষ্টা করছি। এটি প্রশান্তিযুক্ত, এবং পোস্টম্যান ব্যবহার করে আমি পোস্টের অনুরোধটি একটি শেষের দিকে পোস্টের অনুরোধটি প্রেরণ করতে পারি http://subdomain.dev.myapi.com/api/v1/auth/যেমন একটি ব্যবহারকারীর নাম এবং পাসওয়ার্ড পোস্টের ডেটা হিসাবে এবং আমাকে একটি টোকেন ফিরিয়ে দেওয়া হয়েছে। সমস্ত প্রত্যাশার মতো কাজ করে। এখন, যখন আমি পিএইচপি থেকে চেষ্টা করি এবং একই জিনিস করি তখন আমি কোনও GuzzleHttp\Psr7\Responseবস্তু ফিরে পাই , তবে পোস্টম্যান অনুরোধটি করার মতো টোকেনটি এর ভিতরে কোথাও খুঁজে পাবে না।

সম্পর্কিত কোডটি দেখে মনে হচ্ছে:

$client = new Client(['base_uri' => 'http://companysub.dev.myapi.com/']);
$response = $client->post('api/v1/auth/', [
    'form_params' => [
        'username' => $user,
        'password' => $password
    ]
]);

var_dump($response); //or $resonse->getBody(), etc...

উপরের কোডটির আউটপুট এমন কিছু দেখাচ্ছে (সতর্কতা, পাঠ্যের আগমনকারী প্রাচীর):

object(guzzlehttp\psr7\response)#36 (6) {
  ["reasonphrase":"guzzlehttp\psr7\response":private]=>
  string(2) "ok"
  ["statuscode":"guzzlehttp\psr7\response":private]=>
  int(200)
  ["headers":"guzzlehttp\psr7\response":private]=>
  array(9) {
    ["connection"]=>
    array(1) {
      [0]=>
      string(10) "keep-alive"
    }
    ["server"]=>
    array(1) {
      [0]=>
      string(15) "gunicorn/19.3.0"
    }
    ["date"]=>
    array(1) {
      [0]=>
      string(29) "sat, 30 may 2015 17:22:41 gmt"
    }
    ["transfer-encoding"]=>
    array(1) {
      [0]=>
      string(7) "chunked"
    }
    ["content-type"]=>
    array(1) {
      [0]=>
      string(16) "application/json"
    }
    ["allow"]=>
    array(1) {
      [0]=>
      string(13) "post, options"
    }
    ["x-frame-options"]=>
    array(1) {
      [0]=>
      string(10) "sameorigin"
    }
    ["vary"]=>
    array(1) {
      [0]=>
      string(12) "cookie, host"
    }
    ["via"]=>
    array(1) {
      [0]=>
      string(9) "1.1 vegur"
    }
  }
  ["headerlines":"guzzlehttp\psr7\response":private]=>
  array(9) {
    ["connection"]=>
    array(1) {
      [0]=>
      string(10) "keep-alive"
    }
    ["server"]=>
    array(1) {
      [0]=>
      string(15) "gunicorn/19.3.0"
    }
    ["date"]=>
    array(1) {
      [0]=>
      string(29) "sat, 30 may 2015 17:22:41 gmt"
    }
    ["transfer-encoding"]=>
    array(1) {
      [0]=>
      string(7) "chunked"
    }
    ["content-type"]=>
    array(1) {
      [0]=>
      string(16) "application/json"
    }
    ["allow"]=>
    array(1) {
      [0]=>
      string(13) "post, options"
    }
    ["x-frame-options"]=>
    array(1) {
      [0]=>
      string(10) "sameorigin"
    }
    ["vary"]=>
    array(1) {
      [0]=>
      string(12) "cookie, host"
    }
    ["via"]=>
    array(1) {
      [0]=>
      string(9) "1.1 vegur"
    }
  }
  ["protocol":"guzzlehttp\psr7\response":private]=>
  string(3) "1.1"
  ["stream":"guzzlehttp\psr7\response":private]=>
  object(guzzlehttp\psr7\stream)#27 (7) {
    ["stream":"guzzlehttp\psr7\stream":private]=>
    resource(40) of type (stream)
    ["size":"guzzlehttp\psr7\stream":private]=>
    null
    ["seekable":"guzzlehttp\psr7\stream":private]=>
    bool(true)
    ["readable":"guzzlehttp\psr7\stream":private]=>
    bool(true)
    ["writable":"guzzlehttp\psr7\stream":private]=>
    bool(true)
    ["uri":"guzzlehttp\psr7\stream":private]=>
    string(10) "php://temp"
    ["custommetadata":"guzzlehttp\psr7\stream":private]=>
    array(0) {
    }
  }
}

পোস্টম্যানের আউটপুটটি এমন কিছু ছিল:

{
    "data" : {
        "token" "fasdfasf-asfasdfasdf-sfasfasf"
    }
}

স্পষ্টতই আমি গুজলে প্রতিক্রিয়াশীল জিনিসগুলির সাথে কাজ করার বিষয়ে কিছু মিস করছি। গুজলের প্রতিক্রিয়া অনুরোধে 200 টি স্ট্যাটাস কোড নির্দেশ করে, সুতরাং আমি নিশ্চিত না যে ফিরে আসা তথ্য পুনরুদ্ধার করতে আমার ঠিক কী করা দরকার।


33
$response->getBody()->getContents()কাজ করে না?
ফেডারকুন

উত্তর:


437

গুজল PSR-7 প্রয়োগ করে । তার অর্থ এটি পিএইচপি টেম্প স্ট্রিম ব্যবহার করে এমন একটি স্ট্রিমে এটি একটি ডিফল্টরূপে কোনও বার্তার মুদ্রাকে ডিফল্টরূপে সঞ্চয় করবে । সমস্ত ডেটা পুনরুদ্ধার করতে, আপনি কাস্টিং অপারেটর ব্যবহার করতে পারেন:

$contents = (string) $response->getBody();

আপনি এটি দিয়েও করতে পারেন

$contents = $response->getBody()->getContents();

দুটি পদ্ধতির মধ্যে পার্থক্য হ'ল getContentsবাকী বিষয়বস্তু ফিরিয়ে দেয়, যাতে আপনি rewindবা স্রোতের অবস্থানটি না সন্ধান না করলে দ্বিতীয় কল কিছুই দেয় না seek

$stream = $response->getBody();
$contents = $stream->getContents(); // returns all the contents
$contents = $stream->getContents(); // empty string
$stream->rewind(); // Seek to the beginning
$contents = $stream->getContents(); // returns all the contents

পরিবর্তে, পিএইচপি-র স্ট্রিং castালাইয়ের ক্রিয়াকলাপগুলি ব্যবহার করুন, এটি প্রারম্ভ থেকে শেষ না হওয়া পর্যন্ত সমস্ত ডেটা পড়বে।

$contents = (string) $response->getBody(); // returns all the contents
$contents = (string) $response->getBody(); // returns all the contents

ডকুমেন্টেশন: http://docs.gboxphp.org/en/latest/psr7.html# অভিযোগ


5
গেটসেন্টস ফাংশনটি গুজল 6 ডকুমেন্টেশনের (স্ট্রিম বিভাগে) কেবলমাত্র একটি ছোট অংশে রয়েছে এবং আমি এটি মিস করেছি। আপনি আমাকে পুরো অনুসন্ধান থেকে বাঁচিয়েছেন।
ম্যাক্সিমাস

58
ধন্যবাদ. এটি অবিশ্বাস্য যে ডকুমেন্টেশনে এটি আরও পরিষ্কার নয়। এমনকি তাদের অফিশিয়াল ডকুমেন্টেশন ( ডকসস.সাজলফ্প.গ্রা
জন

24
তাদের সরকারী নথিতে একটি নোট বা নোটিশের মতো সত্যই কিছু দেওয়া উচিত। আমি এই ইস্যুতে দু'দিন নষ্ট করেছি।
সিডব্লসু

+1 গুজল ডকুমেন্টেশনে ভ্রান্তভাবে বলা হয়েছে যে "you can pass true to this method [getBody()] to retrieve the body as a string."। এটি গুজল 6 ব্যবহার করে আমার পক্ষে কাজ করছে বলে মনে হয় না, তবে স্ট্রিংয়ে কাস্ট করা বা getContents () ব্যবহার করে কাজ করে।
ম্যাগনাস ডাব্লু

8
আপনি json_decode ব্যবহার করতে পারেন। উদাহরণস্বরূপ এতে আপনার প্রতিক্রিয়া মোড়ানো json_decode($response, true);একটি অ্যারে ফিরিয়ে দেবে।
সিগন

13

যদি JSON ফিরে প্রত্যাশা করে তবে এটি পাওয়ার সহজতম উপায়:

$data = json_decode($response->getBody()); // returns an object

// OR

$data = json_decode($response->getBody(), true); // returns an array

json_decode()দেহটিকে স্বয়ংক্রিয়ভাবে কাস্ট করবে string, তাই কল করার দরকার নেই getContents()


1
কেন এই উত্তরটি বেশি মনোযোগ পাচ্ছে ??? এটি আমার যা প্রয়োজন ঠিক তা-ই। ধন্যবাদ @ মাস্কিমআইভানভ
এরিক ম্যাকউইনএন

এটি আমার পক্ষেও সবচেয়ে সহজ এবং সহজ জিনিস ছিল। ধন্যবাদ
আলাতোর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.