file_get_contents ("php: // input") या $ HTTP_RAW_POST_DATA, जो JSON के अनुरोध को प्राप्त करने के लिए बेहतर है?


120

file_get_contents("php://input")या $HTTP_RAW_POST_DATA- JSON अनुरोध के मुख्य भाग को प्राप्त करने के लिए कौन सा बेहतर है?

और क्लाइंट पक्ष का उपयोग करते समय JSON डेटा भेजने के लिए मुझे किस प्रकार ( GETया POST) का उपयोग करना चाहिए XmlHTTPRequest?

मेरा प्रश्न इस उत्तर से प्रेरित था: कर्ल के साथ JSON को PHP में कैसे पोस्ट किया जाए

उस उत्तर से उद्धरण:

प्रोटोकॉल के नजरिए file_get_contents("php://input")से वास्तव में अधिक सही है, क्योंकि आप वास्तव में http मल्टीपार्ट फॉर्म डेटा को किसी भी तरह से संसाधित नहीं कर रहे हैं।

जवाबों:


195

वास्तव में php://inputआप कच्चे POST डेटा को पढ़ सकते हैं।

यह $ HTTP_RAW_POST_DATA के लिए कम स्मृति गहन विकल्प है और इसे किसी विशेष php.ini निर्देशों की आवश्यकता नहीं है

php://inputके साथ उपलब्ध नहीं है enctype="multipart/form-data"

संदर्भ: http://php.net/manual/en/wrappers.php.php


12
इसके अलावा, PHP 5.6 के रूप में, $HTTP_RAW_POST_DATAपदावनत माना जाता है, और php://inputपुन: उपयोग किया जा सकता है।
क्रिस फॉरेन्स

यह भी देखें enable_post_data_reading
पचेरियर

json_decode (file_get_contents ('php: // input'), True) PHP 7.1 में यह समर्थन URL से $ _GET मान प्राप्त करने के लिए करता है?
कैलास

$ HTTP_RAW_POST_DATA को PHP 7
डैनियल

15

php: // इनपुट एक केवल पढ़ने वाली स्ट्रीम है जो आपको अनुरोध बॉडी से कच्चे डेटा को पढ़ने की अनुमति देता है। POST अनुरोधों के मामले में, $ HTTP_RAW_POST_DATA के बजाय php: // इनपुट का उपयोग करना बेहतर होता है क्योंकि यह विशेष php.ini निर्देशों पर निर्भर नहीं करता है । इसके अलावा, उन मामलों के लिए जहां $ HTTP_RAW_POST_DATA डिफ़ॉल्ट रूप से पॉपुलेटेड नहीं है, यह हमेशा_पोपलेट_राव_पोस्ट_डेटा को सक्रिय करने के लिए संभावित रूप से कम मेमोरी गहन विकल्प है।

स्रोत: http://php.net/manual/en/wrappers.php.php


4
इसके अलावा, PHP 5.6 के रूप में, $HTTP_RAW_POST_DATAपदावनत माना जाता है, और php://inputपुन: उपयोग किया जा सकता है।
क्रिस फॉरेन्स

14

file_get_contents (php: // इनपुट) - कच्चे पोस्ट डेटा हो जाता है और आप इस का उपयोग करने के लिए जब आप एपीआई और लिखने की जरूरत की जरूरत XML / JSON / ... इनपुट है कि PHP द्वारा $ _POST को डीकोड नहीं किया जा सकता है कुछ उदाहरण:

पोस्ट JSON स्ट्रिंग द्वारा भेजें

<input type="button" value= "click" onclick="fn()">
<script>
 function fn(){


    var js_obj = {plugin: 'jquery-json', version: 2.3};

    var encoded = JSON.stringify( js_obj );

var data= encoded


    $.ajax({
  type: "POST",
  url: '1.php',
  data: data,
  success: function(data){
    console.log(data);
  }

});

    }
</script>

1.php

//print_r($_POST); //empty!!! don't work ... 
var_dump( file_get_contents('php://input'));

3

आपके द्वारा अनुरोध भेजने के सामान्य नियम लागू होने चाहिए। यदि अनुरोध जानकारी प्राप्त करने के लिए है (उदाहरण के लिए एक आंशिक खोज 'संकेत' परिणाम, या प्रदर्शित होने के लिए एक नया पृष्ठ, आदि ...) तो आप जीईटी का उपयोग कर सकते हैं। यदि भेजा जा रहा डेटा कुछ बदलने के लिए अनुरोध का एक हिस्सा है (एक डेटाबेस को अपडेट करें, रिकॉर्ड हटाएं, आदि ..) तो POST का उपयोग करें।

सर्वर-साइड, कच्चे इनपुट का उपयोग करने का कोई कारण नहीं है, जब तक कि आप पूरे पोस्ट को हड़पना नहीं चाहते / एक ही बार में डेटा ब्लॉक प्राप्त नहीं कर सकते। आप हमेशा की तरह _GET / _POST सरणियों के माध्यम से इच्छित विशिष्ट जानकारी प्राप्त कर सकते हैं। AJAX पुस्तकालयों जैसे MooTools / jQuery वास्तविक AJAX कॉल करने और डेटा को आपके लिए उपयुक्त स्वरूपों में एन्कोडिंग करने के कठिन हिस्से को संभालेंगे।


यह बिंदु है: मैं संपूर्ण पोस्ट को हथियाना चाहता हूं / एक ही बार में डेटा ब्लॉक प्राप्त करना चाहता हूं, क्योंकि JSON एक चर-कम प्रारूप है, यह सिर्फ डेटा को रैप्रेसेंट करता है।
मैनुअल बिट्टो

@Kucebe मैं यह नहीं देखता कि यह क्यों आवश्यक है, क्यों नहीं JSON डेटा को POST फ़ील्ड में रखा जाए और उसके साथ किया जाए?
पेकाका

यदि आप पूरे JSON ब्लॉक को चाहते हैं, तो JSON टेक्स्ट ब्लॉक को फॉर्म फ़ील्ड में क्यों न असाइन करें और उसे इस तरह सबमिट करें? <input type="hidden" name="data" value="json data here" />पूरी तरह से स्वीकार्य है और आपको $ _REQUEST ['डेटा'] के साथ इसे मामूली रूप से सर्वर-साइड पुनः प्राप्त करने देता है।
मार्क बी

3
एक पोस्ट फ़ील्ड में JSON को एम्बेड करना HTTP सामग्री-प्रकार टैग के उद्देश्य को पराजित करता है, और फ़िडलर और ब्राउज़र डीबगर्स (जो JSON समझ सकता है) में डिबगिंग के लिए उतना अच्छा नहीं है। इसके अलावा, कई तृतीय पक्ष जावास्क्रिप्ट पुस्तकालयों POST JSON पेलोड के रूप में आवेदन / json।
साइबरमोंक

2

JSON डेटा के लिए, इसे "एप्लिकेशन / json" सामग्री-प्रकार के रूप में पोस्ट करना बहुत आसान है। यदि आप GET का उपयोग करते हैं, तो आपको JSON को एक पैरामीटर में एनकोड करना होगा और यह एक तरह से गड़बड़ है। इसके अलावा, जब आप POST करते हैं तो कोई आकार सीमा नहीं होती है। यदि बहुत सीमित है (अधिकतम 4K) तो।


2
अक्सर POST के लिए एक आकार सीमा होती है, लेकिन यह आमतौर पर बहुत अधिक होती है। अपनी जाँच करें php.ini
ब्रैड

2

आपका दूसरा सवाल आसान है, GET में सर्वर और ब्राउजर दोनों तरफ 1-2 किलोबाइट्स का साइज लिमिट है, इसलिए किसी भी तरह का बड़ा डेटा आपको POST के जरिए भेजना होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.