প্রতিক্রিয়া কোড পেয়ে ফাইল_জেট_কন্টেন্টের সাথে এইচটিটিপি অনুরোধ জানায়


88

পোস্টের অনুরোধ করার জন্য আমি file_get_contentsএকসাথে ব্যবহার করার চেষ্টা করছি stream_context_create। এখন পর্যন্ত আমার কোড:

    $options = array('http' => array(
        'method'  => 'POST',
        'content' => $data,
        'header'  => 
            "Content-Type: text/plain\r\n" .
            "Content-Length: " . strlen($data) . "\r\n"
    ));
    $context  = stream_context_create($options);
    $response = file_get_contents($url, false, $context);

এটি ঠিকঠাক কাজ করে, তবে, যখন এইচটিটিপি ত্রুটি ঘটে তখন এটি একটি সতর্কতা ছড়িয়ে দেয়:

file_get_contents(...): failed to open stream: HTTP request failed! HTTP/1.0 400 Bad Request

এবং মিথ্যা প্রত্যাবর্তন। উপায় আছে কি:

  • একটি সতর্কতা দমন (ব্যর্থতার ক্ষেত্রে আমি আমার নিজের ব্যতিক্রম ছুঁড়ে দেওয়ার পরিকল্পনা করছি)
  • স্ট্রিম থেকে ত্রুটি সম্পর্কিত তথ্য (কমপক্ষে, প্রতিক্রিয়া কোড) পান

উত্তর:


152

http://php.net/manual/en/remitted.variables.httpresponseheader.php

file_get_contents("http://example.com", false, stream_context_create(['http' => ['ignore_errors' => true]]));
var_dump($http_response_header);

35
যারা ভাবছেন তাদের জন্য, প্রথম প্রশ্নের উত্তরটি যুক্ত 'ignore_errors' => TRUEকরা $options
জর্জি

4
@ জর্জি আপনি @লাইনের শুরুতে রাখতে পারেন ।
ফ্লুরোসেন্টগ্রিন 5

21

উত্তরগুলির কোনওটিই (ওপি কর্তৃক গৃহীত উত্তর সহ) আসলে দুটি প্রয়োজনীয়তা পূরণ করে না:

  • একটি সতর্কতা দমন (ব্যর্থতার ক্ষেত্রে আমি আমার নিজের ব্যতিক্রম ছুঁড়ে দেওয়ার পরিকল্পনা করছি)
  • স্ট্রিম থেকে ত্রুটি সম্পর্কিত তথ্য (কমপক্ষে, প্রতিক্রিয়া কোড) পান

এখানে আমার গ্রহণ:

function fetch(string $method, string $url, string $body, array $headers = []) {
    $context = stream_context_create([
        "http" => [
            // http://docs.php.net/manual/en/context.http.php
            "method"        => $method,
            "header"        => implode("\r\n", $headers),
            "content"       => $body,
            "ignore_errors" => true,
        ],
    ]);

    $response = file_get_contents($url, false, $context);

    /**
     * @var array $http_response_header materializes out of thin air
     */

    $status_line = $http_response_header[0];

    preg_match('{HTTP\/\S*\s(\d{3})}', $status_line, $match);

    $status = $match[1];

    if ($status !== "200") {
        throw new RuntimeException("unexpected response status: {$status_line}\n" . $response);
    }

    return $response;
}

এটি একটি 200প্রতিক্রিয়াবিহীনতার জন্য ছোঁড়াবে, তবে আপনি সহজেই সেখান থেকে কাজ করতে পারবেন, উদাহরণস্বরূপ একটি সাধারণ Responseশ্রেণি যুক্ত করুন এবং return new Response((int) $status, $response);যদি এটি আপনার ব্যবহারের ক্ষেত্রে আরও ভাল ফিট করে।

উদাহরণস্বরূপ, POSTএকটি এপিআই শেষ পয়েন্টে জেএসএন করা:

$response = fetch(
    "POST",
    "http://example.com/",
    json_encode([
        "foo" => "bar",
    ]),
    [
        "Content-Type: application/json",
        "X-API-Key: 123456789",
    ]
);

উল্লেখ্য ব্যবহার "ignore_errors" => trueমধ্যে httpপ্রেক্ষাপটে মানচিত্র - এই অ 2xx অবস্থা কোডগুলি ত্রুটি নিক্ষেপ থেকে ফাংশন প্রতিরোধ করবে।

বেশিরভাগ ব্যবহারের ক্ষেত্রে এটি সম্ভবত "সঠিক" ত্রুটি-দমন করার পরিমাণ - আমি @ত্রুটি-দমন অপারেটরটি ব্যবহার করার পরামর্শ দিই না , কারণ এটি ভুল তর্কগুলি সহজেই পাস করার মতো ত্রুটিগুলিও দমন করবে, যা অনিচ্ছাকৃতভাবে কোনও বাগ লুকিয়ে রাখতে পারে কলিং কোড


5

HTTP কোড পাওয়ার জন্য গৃহীত প্রতিক্রিয়ার সাথে আরও কয়েকটি লাইন যুক্ত করা হচ্ছে

function getHttpCode($http_response_header)
{
    if(is_array($http_response_header))
    {
        $parts=explode(' ',$http_response_header[0]);
        if(count($parts)>1) //HTTP/1.0 <code> <text>
            return intval($parts[1]); //Get code
    }
    return 0;
}

@file_get_contents("http://example.com");
$code=getHttpCode($http_response_header);

ত্রুটি আউটপুটটি আড়াল করতে উভয় মন্তব্যই ঠিক আছে, অগ্রাহ্য_অর্থগুলি = সত্য বা @ (আমি পছন্দ করি @


-1

আমি এই পৃষ্ঠাটিতে অন্যরকম একটি সমস্যা নিয়ে চলেছি, তাই আমার উত্তর পোস্ট করে। আমার সমস্যাটি হ'ল আমি কেবল সতর্কতা বিজ্ঞপ্তিটি দমন করতে এবং ব্যবহারকারীর জন্য একটি কাস্টমাইজড সতর্কতা বার্তা প্রদর্শন করার চেষ্টা করছিলাম, সুতরাং এই সহজ এবং সুস্পষ্ট সমাধানটি আমাকে সহায়তা করেছিল:

// Suppress the warning messages
error_reporting(0);

$contents = file_get_contents($url);
if ($contents === false) {
  print 'My warning message';
}

এবং যদি প্রয়োজন হয়, তার পরে ত্রুটি প্রতিবেদন ফিরিয়ে দিন:

// Enable warning messages again
error_reporting(-1);

-2

@file_get_contentsএবং ignore_errors = trueএক নয়: প্রথমটি কোনও কিছুই ফেরায় না; দ্বিতীয়টি ত্রুটি বার্তাগুলিকে দমন করে তবে সার্ভারের প্রতিক্রিয়া দেয় (যেমন 400 খারাপ অনুরোধ)।

আমি এই জাতীয় একটি ফাংশন ব্যবহার:

$result = file_get_contents(
  $url_of_API, 
  false, 
  stream_context_create([
    'http' => [
      'content' => json_encode(['value1' => $value1, 'value2' => $value2]), 
      'header' => 'Authorization: Basic XXXXXXXXXXXXXXX', 
      'ignore_errors' => 1, 
      'method' => 'POST', 
      'timeout' => 10
    ]
  ])
);

return json_decode($result)->status;

এটি 200 (ওকে) বা 400 (খারাপ অনুরোধ) প্রদান করে।

এটি নিখুঁতভাবে কাজ করে এবং এটি সিআরএল-এর চেয়ে সহজ।


এবং এটি কীভাবে সমস্যার সমাধান করে? আপনি কীভাবে প্রতিক্রিয়া কোড পাবেন তা ব্যাখ্যা করতে পারেন?
নিকো হাজে

@ নিকো আমার সমাধান সম্পর্কে আপনার কী ধারণা?
বেনসেন

এটি এখনও খারাপ, কারণ আপনি কোনও JSON ফলাফলের বিশ্লেষণ করেন না এবং নামটি র্যান্ডম ফিল্ডটি পড়েন নাstatus
এটিআইপি

এটা স্পষ্ট যে আমি যে সংস্থাগুলি সংযুক্ত হয়েছি তার সাথে আমি JSON প্রতিক্রিয়া ফিরিয়ে দিচ্ছি এবং আমার উদ্দেশ্য (200 বা 400) এর জন্য আমার যা জানতে হবে তা "স্থিতি" ক্ষেত্রে রয়েছে। এটাই আমার দরকার এবং আমি এটাই পাই। আপনার যদি HTTP স্থিতি কোডটি জানা দরকার, কেবল এটি করুন: ফিরে আসুন $ http_response_header [0]; তবে মনে রাখবেন যে এটি @ ফাইল_জেট_কন্টেন্টের সাথে কাজ করে না।
বেনসেন

এবং এটি কীভাবে মূল প্রশ্নের উত্তর দেয়? আপনি কেন মনে করেন যে $http_response_header[0], এটি একটি উচ্চ উত্সাহিত উত্তর, কাজ করে না file_get_contents?
নিকো হাজে 14
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.