2010-10-08 17 views
5

मुझे पता है कि एक HTTP पोस्ट विधि के दृश्य के पीछे क्या होता है यह जानना चाहते हैं। i.e ब्राउज़र PHP में एक सर्वर साइड स्क्रिप्ट के लिए एक HTTP पोस्ट अनुरोध भेजता है (उदाहरण के लिए)।http पोस्ट विधि कैसे कार्यान्वित की जाती है?

PHP के $ _POST चर क्लाइंट से मूल्य कैसे प्राप्त करते हैं।

कोई विवरण में समझा सकता है या एक गाइड को इंगित कर सकता है।

उत्तर

1

ब्राउज़र content-type of the form के अनुसार डेटा को एन्कोड करता है, फिर इसे POST अनुरोध के शरीर के रूप में प्रेषित करता है। PHP तब इसे उठाता है और $_POST को नाम और मानों के साथ पॉप्युलेट करता है (विशेष हैंडलिंग निष्पादित करते समय नाम में [ और ] या . शामिल हैं)।

+0

क्या इसके लिए क्या करता है।) – abel

+0

यह इसे '_' – Quentin

+0

में परिवर्तित करता है, यह '_' में बदल जाता है (ऐतिहासिक कारणों से, अधिकतर; यह माना जाता है कि फ़ॉर्म में प्रत्येक चर वास्तविक चर में बदल गया है। Google के लिए" register_globals "के लिए विवरण वह अंतिम भाग)। – cHao

0

मैं एक कैप्चरिंग प्रॉक्सी (उदा। Fiddler) या नेटवर्क कैप्चर टूल (उदा। Wireshark) प्राप्त करने का सुझाव देता हूं और थोड़ी देर के लिए अपना स्वयं का ब्राउज़िंग ट्रैफ़िक देखता हूं; यह आपको इस मुद्दे का अच्छा विचार देगा।

इसके अलावा, पोस्ट जीईटी के समान है, सिवाय इसके कि डेटा यूआरएल के बजाय अनुरोध के शरीर में भेजा जाता है, और उन्हें एन्कोड करने के दो तरीके हैं (मल्टीपार्ट-फॉर्म-डेटा के अलावा urlencode जिसे GET के साथ साझा किया गया है)

+0

ब्राउज़र में * फॉर्म * के साथ काम करने के कुछ तरीके हैं, लेकिन एक्सएचआर पोस्ट (या आमतौर पर करते हैं) या तो यूआरएल-एन्कोडिंग या मल्टीपार्ट/फॉर्म-डेटा के बजाय JSON, XML, आदि का उपयोग कर सकते हैं। कोर्स, तो आपको आमतौर पर पोस्ट डेटा पढ़ना होगा और इसे स्वयं डीकोड करना होगा। – cHao

4

HTTP प्रोटोकॉल (*) निर्दिष्ट करता है कि ब्राउज़र को अनुरोध कैसे भेजना चाहिए।

HTTP मूल रूप से लाइन फ़ीड्स से अलग, सादे पाठ में हेडर का एक सेट होता है, जिसके बाद डेटा प्रसारित किया जाता है। HTTP अनुरोध के अंदर, POST डेटा वास्तव में डेटा डेटा के रूप में उतना ही स्वरूपित होता है; यह सिर्फ HTTP शीर्षकों के एक अलग हिस्से में है।

आप Firebug या Fiddler जैसे टूल का उपयोग कर सकते हैं ताकि यह देखने के लिए कि हेडर और डेटा इनकमिंग और आउटगोइंग HTTP अनुरोधों के लिए प्रारूपित कैसे हैं। यह वास्तव में पढ़ने के लिए काफी सरल है, इसलिए आप इसे देखकर इसे बाहर करने में सक्षम होना चाहिए।

एक बार यह सर्वर पर पहुंचने के बाद, PHP दुभाषिया कच्चे HTTP अनुरोध डेटा को अपने मानक $ _GET, $ _POST, आदि चर में अनुवाद करने के लिए ज़िम्मेदार है। यह ऐसा कुछ है जो PHP आपके लिए करता है।

अन्य भाषाओं (जैसे पर्ल) में यह कार्यक्षमता नहीं है, इसलिए एक पर्ल प्रोग्रामर को आने वाले अनुरोध डेटा को उपयोगी चर में पार्स करने के लिए उनके प्रोग्राम में कोड होना होगा। सौभाग्य से, यहां तक ​​कि पर्ल में एक मानक लाइब्रेरी भी शामिल है जिसे नौकरी मिलती है, इसलिए पर्ल प्रोग्रामर को आम तौर पर कोड को खुद लिखना नहीं पड़ता है।

PHP, और कोई अन्य भाषा, जिस तरह से यह केवल स्ट्रिंग मैनिपुलेशन है। जैसा कि मैंने कहा, HTTP डेटा सादा पाठ है और इसे सरल स्ट्रिंग प्रारूप में प्राप्त किया जाता है, इसलिए यह इसे प्रश्न चिह्न और बराबर चिह्न वर्णों पर विभाजित करके इसे तोड़ने का एक मामला है।

चूंकि PHP दृश्यों के पीछे यह सब करता है, तो आपको शायद सटीक तंत्र के बारे में चिंता करने की आवश्यकता नहीं है, लेकिन यदि आप वास्तव में जानना चाहते हैं तो PHP स्रोत कोड उपलब्ध है।

मैंने कहा कि यह सब सादा पाठ में है। एचटीटीपीएस, निश्चित रूप से, एन्क्रिप्टेड है। हालांकि जब तक PHP इसे पकड़ लेता है, तब तक अपाचे सर्वर पहले ही डिक्रिप्शन कर चुका है, इसलिए जहां तक ​​PHP का संबंध है, यह अभी भी सादा पाठ है।

(*) इससे पहले कि कोई मुझे इस पर खींच ले, हाँ, मुझे पता है कि "HTTP प्रोटोकॉल" एक अनावश्यकता है, जैसे "एटीएम मशीन" या "पिन नंबर"।कदम से

+1

अनावश्यकता के लिए, "$ _GET, $ _POST चर" के बारे में क्या? आखिरी बार मैंने जांच की, एक $ से शुरू होने वाला कोई भी शब्द परिभाषा द्वारा परिवर्तनीय है .... :) (अरे, आपने इसके लिए पूछा।) – cHao

+0

@cHao - hehe। हाँ, मुझे लगता है मैंने किया था। :) – Spudley

0

ठीक है, चलो ilustrate कदम है, एक से युक्त एक पेज [प्रपत्र कार्रवाई = "foo.php" विधि = "पोस्ट"]

एक बार जब आप प्रस्तुत (या enter दबाने पर) क्लिक करें, ब्राउज़र होगा के साथ शुरू "सबमिट" नामक एक ईवेंट ट्रिगर करें। इस घटना को जावास्क्रिप्ट/डोम के साथ प्रसंस्करण के लिए आंतरिक रूप से पकड़ लिया जा सकता है, और यह वही है जो अधिकांश साइटें सत्यापन या अजाक्स रूटीन के लिए करती हैं।

यदि दिनचर्या वापसी के साथ प्रवाह को रोक नहीं देती है, तो ब्राउज़र पोस्ट अनुरोध को संसाधित करता रहता है (यह प्रक्रिया XMLHttpRequest ऑब्जेक्ट के साथ एक पोस्ट बनाने जैसा ही है)।

ब्राउज़र पहली विधि, क्रिया और सामग्री एन्कोडिंग की जांच करेगा, फिर इनपुट डेटा को उस डेटा के आकार को जानने के लिए पार्स करेगा जो उसे भेजेगा और उसे एन्कोड करेगा।

POST /foo.php HTTP/1.1 
Host: example.org 
Content-Type: application/x-www-form-urlencoded 
Content-Length: 7 

foo=bar 

यह एक पोस्ट अनुरोध है:

अंत में यह इस (कच्चे मान) की तरह कुछ भेज देते हैं। लेकिन ध्यान दें कि यह सामग्री-लंबाई भेज सकता है और भागों में चर भेज सकता है। ब्राउज़र और सर्वर यह जानते हैं कि यह हो सकता है (यह POST विधि उद्देश्य है)। जब कोई सर्वर POST अनुरोध प्राप्त करता है, तो यह तब तक ब्राउज़र को सुनता रहता है जब तक सामग्री प्राप्त सामग्री की लंबाई से मेल नहीं खाती।

अब दूसरी तरफ। सर्वर अनुरोध प्राप्त करता है, सामग्री सुनता है, इसे पार्स करें (foo = bar; xxx = baz), और इसे उस विशिष्ट अनुरोध के लिए अपने पर्यावरण पर उपलब्ध कराएं, इस प्रकार आप इसे PHP या पायथन या जावा से पकड़ सकते हैं ...

यही है। आह नोट आप एक ही अनुरोध में जीईटी और पोस्ट चर दोनों पास कर सकते हैं!

एक का उपयोग [फार्म कार्रवाई = "foo.php? SomeVar = 123 & anotherVar = TRUE" विधि = "पोस्ट"]

देगा ब्राउज़र के रूप में

POST /foo.php?someVar=123&anotherVar=TRUE HTTP/1.1 
Host: example.org 
Content-Type: application/x-www-form-urlencoded 
Content-Length: 7 

foo=bar 

और सर्वर अनुरोध भेजने यह अनुरोध निम्न चर उपलब्ध करायेंगे को पार्स:

  • प्राप्त [someVar] = 123
  • प्राप्त [anotherVar] = TRUE
  • पोस्ट [foo] = बार
संबंधित मुद्दे