मैं निम्नलिखित के रूप में एक php पृष्ठ पर पोस्ट के रूप में प्रस्तुत करता हूं:
{a:1}
यह अनुरोध (एक POST अनुरोध) का निकाय है।
Php में, मुझे उस मूल्य को निकालने के लिए क्या करना होगा?
var_dump($_POST);
समाधान नहीं है, काम नहीं कर रहा है।
मैं निम्नलिखित के रूप में एक php पृष्ठ पर पोस्ट के रूप में प्रस्तुत करता हूं:
{a:1}
यह अनुरोध (एक POST अनुरोध) का निकाय है।
Php में, मुझे उस मूल्य को निकालने के लिए क्या करना होगा?
var_dump($_POST);
समाधान नहीं है, काम नहीं कर रहा है।
जवाबों:
POST या PUT अनुरोध (या किसी अन्य HTTP विधि) के निकाय तक पहुँचने के लिए:
$entityBody = file_get_contents('php://input');
इसके अलावा, STDIN
स्थिरांक एक पहले से खुली हुई धारा है php://input
, जिससे आप वैकल्पिक रूप से कर सकते हैं:
$entityBody = stream_get_contents(STDIN);
से मैं पर पीएचपी मैनुअल प्रविष्टि / ओ धाराओं डॉक्स :
php: // input एक केवल पढ़ने वाली स्ट्रीम है जो आपको अनुरोध बॉडी के कच्चे डेटा को पढ़ने की अनुमति देता है। पोस्ट अनुरोध के मामले में, यह उपयोग करने के लिए बेहतर है php: // इनपुट के बजाय
$HTTP_RAW_POST_DATA
के रूप में यह विशेष php.ini निर्देशों पर निर्भर नहीं करता। इसके अलावा, उन मामलों के लिए, जहां$HTTP_RAW_POST_DATA
डिफ़ॉल्ट रूप से आबादी नहीं है, यह हमेशा चालू रखने के लिए एक संभावित कम मेमोरी गहन विकल्प है। php: // input enctype = "मल्टीपार्ट / फॉर्म-डेटा" के साथ उपलब्ध नहीं है।
विशेष रूप से आप यह नोट करना चाहेंगे कि php://input
स्ट्रीम, चाहे आप इसे किसी वेब SAPI में कैसे एक्सेस करें, यह खोजी नहीं है । इसका मतलब है कि यह केवल एक बार पढ़ा जा सकता है। यदि आप एक ऐसे वातावरण में काम कर रहे हैं जहाँ बड़े HTTP निकाय निकायों को नियमित रूप से अपलोड किया जाता है, तो आप इनपुट को उसके स्ट्रीम रूप में बनाए रखना चाह सकते हैं (बजाय इसके पहले उदाहरण की तरह बफ़र करना)।
धारा संसाधन को बनाए रखने के लिए कुछ इस तरह मददगार हो सकता है:
<?php
function detectRequestBody() {
$rawInput = fopen('php://input', 'r');
$tempStream = fopen('php://temp', 'r+');
stream_copy_to_stream($rawInput, $tempStream);
rewind($tempStream);
return $tempStream;
}
php://temp
आपको मेमोरी खपत का प्रबंधन करने की अनुमति देता है क्योंकि यह डेटा की एक निश्चित राशि संग्रहीत होने के बाद पारदर्शी रूप से फाइलसिस्टम स्टोरेज में बदल जाएगा (डिफ़ॉल्ट रूप से 2 एम)। इस आकार को php.ini फ़ाइल में जोड़कर या जोड़कर /maxmemory:NN
, NN
अस्थायी फ़ाइल का उपयोग करने से पहले मेमोरी में रखने के लिए डेटा की अधिकतम मात्रा बाइट्स में बताई जा सकती है।
बेशक, जब तक आपके पास इनपुट स्ट्रीम पर मांग करने का एक बहुत अच्छा कारण नहीं है, तब तक आपको वेब एप्लिकेशन में इस कार्यक्षमता की आवश्यकता नहीं होनी चाहिए। HTTP अनुरोध इकाई निकाय को पढ़ना एक बार आम तौर पर पर्याप्त होता है - ग्राहकों को पूरे दिन इंतजार नहीं करना चाहिए जबकि आपका ऐप यह बताता है कि क्या करना है।
ध्यान दें कि php: // इनपुट Content-Type: multipart/form-data
हेडर निर्दिष्ट करने के अनुरोध के लिए उपलब्ध नहीं है ( enctype="multipart/form-data"
HTML रूपों में)। PHP से यह परिणाम पहले से ही फॉर्म डेटा को $_POST
सुपरग्लोबल में पार्स कर दिया है ।
php://input
लिए खाली हैapplication/x-www-form-urlencoded
multipart/form-data
php://input
है। इसलिए (फास्ट) सीजीआई कॉन्फ़िगरेशन stream_get_contents(STDIN)
काम नहीं file_get_contents("php://input")
करेगा।
ऐरे में वापसी मूल्य
$data = json_decode(file_get_contents('php://input'), true);
$data
जाँचने के लिए साहचर्य सरणी के माध्यम से लूप करना होगा कि क्या प्रत्येक मान आपकी इच्छानुसार एन्कोडेड है। चीजों को देखने का "स्ट्रीम-टू-डेटाटाइप" तरीका सरल हो सकता है, लेकिन यह स्ट्रीम फ़िल्टर का उपयोग करके "स्ट्रीम फॉर्म" में एन्कोडिंग से निपटने के लिए उतना कुशल नहीं हो सकता है। यदि आप एन्कोडिंग मुद्दों को संभाल नहीं रहे हैं और केवल स्वच्छता और सत्यापन कर रहे हैं, तो आप एक कदम याद कर रहे हैं।
खाली होने का एक संभावित कारण $_POST
यह है कि अनुरोध नहीं है POST
, या POST
अब नहीं है ... यह पोस्ट के रूप में शुरू हो सकता है, लेकिन कहीं एक 301
या 302
अनुप्रेषित का सामना करना पड़ता है, जिसे स्विच किया जाता है GET
!
$_SERVER['REQUEST_METHOD']
यदि यह मामला है, तो जांच करने के लिए निरीक्षण करें।
यह क्यों नहीं होना चाहिए, लेकिन अभी भी करता है की एक अच्छी चर्चा के लिए https://stackoverflow.com/a/19422232/109787 देखें ।
POST
लेकिन निरीक्षण करने के बाद यह दिखा रहा था कि यह था GET
। एक बार जब मैंने /
अपने URL के अंत में जोड़ा , तो उसने POST दिखाना शुरू कर दिया। अजीब!
यदि आपने HTTP PECL एक्सटेंशन स्थापित किया है, तो आप http_get_request_body()
स्ट्रिंग के रूप में बॉडी डेटा प्राप्त करने के लिए फ़ंक्शन का उपयोग कर सकते हैं ।
यदि आपके पास pecl / http एक्सटेंशन स्थापित है, तो आप इसका उपयोग भी कर सकते हैं:
$request = new http\Env\Request();
$request->getBody();
function getPost()
{
if(!empty($_POST))
{
// when using application/x-www-form-urlencoded or multipart/form-data as the HTTP Content-Type in the request
// NOTE: if this is the case and $_POST is empty, check the variables_order in php.ini! - it must contain the letter P
return $_POST;
}
// when using application/json as the HTTP Content-Type in the request
$post = json_decode(file_get_contents('php://input'), true);
if(json_last_error() == JSON_ERROR_NONE)
{
return $post;
}
return [];
}
print_r(getPost());
json_last_error() == JSON_ERROR_NONE
ऐसा है false
, कि एक खाली सरणी वापस आनी चाहिए। अगर किसी ने XML या YAML जमा किया है तो क्या होगा? सामग्री-प्रकार के लिए एक परीक्षण जोड़ें और वहां से जाएं।
$_SERVER
जाँच करने के लिए उपयोगी मूल्यों के लिए सुपरग्लोबल देखें ।
http_get_request_body()
दस्तावेज़ीकरण के अनुसार PUT
और POST
अनुरोध प्राप्त करने के लिए स्पष्ट रूप से बनाया गया था http://php.net/manual/fa/function.http-get-request-body.php
$_POST
सुपरग्लोब के माध्यम से उपलब्ध नहीं है । यह PUT अनुरोधों के मामले में भी (विशेष रूप से) सही है, क्योंकि PHP के पास कोई सुपरग्लोबल नहीं है।