प्रतिक्रिया कोड प्राप्त करते हुए, file_get_contents के साथ HTTP अनुरोध


88

मैं POST अनुरोध करने के लिए 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);

यह ठीक काम करता है, हालांकि, जब HTTP त्रुटि होती है, तो यह चेतावनी देता है:

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

और झूठा लौट आता है। क्या कोई तरीका है:

  • एक चेतावनी दबाएं (मैं विफलता के मामले में अपना खुद का अपवाद फेंकने की योजना बना रहा हूं)
  • स्ट्रीम से त्रुटि जानकारी (कम से कम, प्रतिक्रिया कोड) प्राप्त करें

जवाबों:


152

http://php.net/manual/en/reserved.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
@georg आप @लाइन की शुरुआत में भी डाल सकते हैं ।
प्रतिदीप्तग्रीन

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एपीआई एंडपॉइंट के लिए JSON करने के लिए:

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

त्रुटि आउटपुट को छिपाने के लिए दोनों टिप्पणियां ठीक हैं, ign_errors = true या @ (मुझे पसंद है @)


-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 (खराब अनुरोध) देता है।

यह पूरी तरह से काम करता है और यह cURL से आसान है।


और यह प्रश्न कैसे हल करता है? क्या आप बता सकते हैं कि प्रतिक्रिया कोड कैसे प्राप्त करें?
निको हेस

@ निको तुम मेरे समाधान के बारे में क्या सोचते हो?
Besen

यह अभी भी एक बुरा है, क्योंकि आप एक JSON परिणाम को पार्स करते हैं और नामांकित यादृच्छिक क्षेत्र को नहीं पढ़ते हैं status- इसका एपीआई कॉल के लिए HTTP स्थिति कोड से कोई संबंध नहीं है
निको हेस

यह स्पष्ट है कि RESTful API मैं JSON प्रतिक्रिया देने के लिए कनेक्ट करता हूं और जो मुझे अपने उद्देश्य (200 या 400) के लिए जानना आवश्यक है वह "स्थिति" फ़ील्ड में निहित है। मुझे बस इतना ही चाहिए। यदि आपको HTTP स्थिति कोड जानने की आवश्यकता है, तो बस यह करें: $ http_response_header [0] वापस करें; लेकिन ध्यान दें कि यह @file_get_contents के साथ काम नहीं करता है।
Besen

और यह मूल प्रश्न का उत्तर कैसे देता है? आप ऐसा क्यों सोचते हैं $http_response_header[0], एक अत्यधिक उत्कट उत्तर, साथ काम नहीं करता है file_get_contents?
निको हासे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.