नवीनतम लेख
घर / मिश्रित / HTTP में get कैसे काम करता है. पोस्ट करें और अनुरोध प्राप्त करें, उनमें क्या अंतर है और कौन सा बेहतर है और किस उद्देश्य के लिए है? HTTP प्रोटोकॉल. परिचय

HTTP में get कैसे काम करता है. पोस्ट करें और अनुरोध प्राप्त करें, उनमें क्या अंतर है और कौन सा बेहतर है और किस उद्देश्य के लिए है? HTTP प्रोटोकॉल. परिचय

यह और निम्नलिखित अनुभाग संक्षेप में बताएंगे कि PHP का उपयोग करके बुनियादी वेब एप्लिकेशन कैसे बनाएं। अनुभाग में जो चर्चा की गई वह स्पष्ट रूप से आपके एप्लिकेशन के लिए उपयोगकर्ता के साथ संवाद करने और उसके द्वारा किए गए कार्यों या उसके द्वारा दर्ज किए गए मापदंडों के आधार पर तैयार करने के लिए पर्याप्त नहीं है। क्या नहीं हैं? उपयोगकर्ता डेटा इनपुट को व्यवस्थित करने और इस डेटा को सर्वर पर स्थानांतरित करने के बारे में पर्याप्त ज्ञान नहीं है। ठीक है, आपको पहले से ही सर्वर पर प्राप्त जानकारी को प्रोग्रामेटिक रूप से संसाधित करने के बारे में बुनियादी ज्ञान होना चाहिए।

HTTP अनुरोध विधियाँ और उनके पैरामीटर

कोई भी गतिशील वेब एप्लिकेशन उपयोगकर्ता द्वारा उसके द्वारा दर्ज किए गए मापदंडों या क्लाइंट पक्ष पर किए गए कार्यों के अनुसार प्रतिक्रिया उत्पन्न करता है। सर्वर से संपर्क करने पर अक्सर दो प्रकार के अनुरोध आते हैं: GET विधि या POST विधि का उपयोग करना। इन दो प्रकार के अनुरोधों के बीच अंतर के बारे में कुछ शब्द।

विधि प्राप्त करें:

    पैरामीटर HTTP अनुरोध हेडर में भेजे जाते हैं, इसलिए वे दिखाई देते हैं कमांड लाइन, और ऐसे अनुरोध को बुकमार्क में सहेजा जा सकता है। चूँकि हेडर की कुल लंबाई सीमित है, GET का उपयोग करके पारित मापदंडों की संख्या और लंबाई भी सीमित है।

    ऐसा माना जाता है कि एक पंक्ति में निष्पादित कई समान GET अनुरोधों के परिणाम समान होने चाहिए।

पोस्ट विधि:

    अनुरोध पैरामीटर HTTP अनुरोध के मुख्य भाग में पारित किए जाते हैं, इसलिए वे कमांड लाइन पर मौजूद नहीं होते हैं। मापदंडों की संख्या और आकार असीमित है.

    ऐसा माना जाता है कि एकाधिक समान POST अनुरोधों के परिणाम अलग-अलग मान लौटा सकते हैं क्योंकि वे लक्ष्य वस्तु के गुणों को बदल सकते हैं।

जब लक्ष्य संसाधन की डेटा संरचनाओं में परिवर्तन करने की कोई आवश्यकता नहीं होती है, तो मापदंडों के अनुसार सूचना संसाधन की सामग्री को पुनः प्राप्त करने के लिए GET पद्धति का उपयोग किया जाना चाहिए, और बुकमार्क में अनुरोध (URL) को सहेजना समझ में आता है। GET विधि POST विधि का उपयोग करके समान अनुरोधों की तुलना में तेज़ प्रदर्शन कर सकती है।

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

संसाधन का पथ?parameter1=value1¶meter2=value2&…

यदि आपके पास पैरामीटर भरने के लिए कोई विशेष HTML फॉर्म नहीं है, तो आप सीधे ब्राउज़र कमांड लाइन पर परीक्षण पैरामीटर पास करके अपने PHP एप्लिकेशन को डीबग कर सकते हैं, उदाहरण के लिए:

Http://site/php-samples/sql.php?sql=select * d_staff से

सर्वर साइड पर अनुरोध पैरामीटर तक पहुंचने के लिए, आपको वैश्विक सरणियों का उपयोग करना चाहिए $_प्राप्त करेंऔर $_पोस्टक्रमश। यदि आपके एप्लिकेशन को इस बात की परवाह नहीं है कि इसे किस विधि से एक्सेस किया गया है, तो आपको एक ऐरे का उपयोग करना चाहिए $_अनुरोध, जो $_GET और $_POST सरणियों के डेटा को जोड़ता है, उदाहरण के लिए, इस तरह:

$sql = isset($_REQUEST["sql"])? $_REQUEST["sql"] : "";

इस उदाहरण में, प्रोग्राम यह निर्धारित करता है कि क्या "एसक्यूएल" पैरामीटर पारित किया गया था: यदि हां, तो यह संबंधित चर को अपना मान निर्दिष्ट करता है, और यदि नहीं, तो यह इसे एक खाली मान निर्दिष्ट करता है।

HTML फॉर्म के माध्यम से HTTP अनुरोध पैरामीटर को परिभाषित करना

बेशक, सीधे ब्राउज़र कमांड लाइन में पैरामीटर को मैन्युअल रूप से परिभाषित करना बहुत सुविधाजनक नहीं है। जब वेब एप्लिकेशन एक दूसरे के साथ संचार करते हैं तो यह विधि HTTP अनुरोधों के प्रोग्रामेटिक निष्पादन के लिए उपयुक्त है। क्लाइंट पक्ष पर प्रारंभिक डेटा सत्यापन दर्ज करने और करने के लिए, आपको HTML फॉर्म का उपयोग करना चाहिए। नीचे एक उदाहरण है सबसे सरल रूप, जिसके साथ एक टेक्स्ट पैरामीटर (मान) दर्ज किया जाता है, जिसे बाद में POST विधि के पैरामीटर के रूप में सर्वर पर भेज दिया जाता है।

तरीका = "पोस्ट" कार्रवाई ='sql.php' > एसक्यूएल:

प्रपत्र तत्व की विधि विशेषता उस विधि को निर्दिष्ट करती है जो सर्वर पर डेटा संचारित करने (प्राप्त करने या पोस्ट करने) की विधि निर्धारित करती है। क्रिया विशेषता निर्दिष्ट करती है php फ़ाइल , जो अनुरोध पर कार्रवाई करेगा। यदि हैंडलर वर्तमान फ़ाइल होना चाहिए, तो एक्शन विशेषता को जोड़ने की आवश्यकता नहीं है। उन सभी तत्वों के लिए जिनका मान HTTP अनुरोध पैरामीटर के रूप में पारित किया जाना चाहिए, आपको नाम विशेषता के लिए एक अद्वितीय मान परिभाषित करना होगा। यह विशेषता मान है नामहोगा अनुक्रमणिका$_GET, $_POST या $_REQUEST सरणियों में (ऊपर उदाहरण देखें)। एक बटन दबाना जमा करनासभी दर्ज मानों के साथ फॉर्म को सर्वर पर भेजता है।

PHP POST अनुरोध करने की पहली विधि file_get_contents का उपयोग करना है। दूसरी विधि कुछ अन्य कार्यों के साथ संयोजन में फ़्रेड का उपयोग करेगी। आवश्यक अनुरोध हेडर फ़ील्ड भरने के लिए दोनों विकल्प स्ट्रीम_कॉन्टेक्स्ट_क्रिएट फ़ंक्शन का उपयोग करते हैं।

कोड स्पष्टीकरण

$sPD वैरिएबल में स्थानांतरित किया जाने वाला डेटा शामिल है। यह HTTP अनुरोध स्ट्रिंग प्रारूप में होना चाहिए, इसलिए कुछ विशेष वर्णों को एन्कोड किया जाना चाहिए।

File_get_contents फ़ंक्शन और फ़्रेड फ़ंक्शन दोनों में हमारे पास दो नए पैरामीटर हैं। पहला है use_include_path । चूँकि हम एक HTTP अनुरोध कर रहे हैं, यह दोनों उदाहरणों में गलत होगा। जब स्थानीय संसाधन को पढ़ने के लिए सही पर सेट किया जाता है, तो फ़ंक्शन include_path पर फ़ाइल की तलाश करेगा।

दूसरा पैरामीटर संदर्भ है, जो स्ट्रीम_कॉन्टेक्स्ट_क्रिएट के रिटर्न मान से भरा हुआ है, जो $aHTTP सरणी का मान लेता है।

POST अनुरोध करने के लिए file_get_contents का उपयोग करना

PHP में file_get_contents का उपयोग करके POST अनुरोध भेजने के लिए, आपको हेडर फ़ील्ड को मैन्युअल रूप से भरने के लिए Stream_context_create का उपयोग करना होगा और निर्दिष्ट करना होगा कि किस "रैपर" का उपयोग करना है - में इस मामले में HTTP:

$sURL = "http://brugbart.com/Examples/http-post.php"; // पोस्ट यूआरएल $sPD = "नाम=जैकब&बेंच=150"; // POST डेटा $aHTTP = array("http" => // रैपर जिसका उपयोग किया जाएगा array("method" => "POST", // अनुरोध विधि // अनुरोध हेडर "हेडर" => "सामग्री" के नीचे सेट किए गए हैं - प्रकार: एप्लिकेशन/x-www-form-urlencoded", "content" => $sPD)); $संदर्भ = स्ट्रीम_कॉन्टेक्स्ट_क्रिएट($aHTTP); $सामग्री = file_get_contents($sURL, गलत, $संदर्भ); प्रतिध्वनि $सामग्री;

POST अनुरोध निष्पादित करने के लिए फ़्रेड का उपयोग करना

आप POST अनुरोध करने के लिए फ़्रेड फ़ंक्शन का उपयोग कर सकते हैं। निम्नलिखित उदाहरण आवश्यक HTTP अनुरोध हेडर लिखने के लिए Stream_context_create का उपयोग करता है:

$sURL = "http://brugbart.com/Examples/http-post.php"; // पोस्ट यूआरएल $sPD = "नाम=जैकब&बेंच=150"; // पोस्ट डेटा $aHTTP = सरणी("http" => // रैपर जिसका उपयोग किया जाएगा सरणी("विधि" => "पोस्ट", // अनुरोध विधि // अनुरोध हेडर "हेडर" => "सामग्री" के नीचे सेट किए गए हैं - प्रकार: एप्लिकेशन/x-www-form-urlencoded", "content" => $sPD)); $संदर्भ = स्ट्रीम_कॉन्टेक्स्ट_क्रिएट($aHTTP); $हैंडल = fopen($sURL, "r", गलत, $संदर्भ); $सामग्री = ""; जबकि (!feof($handle)) ($contents .= fread($handle, 8192); ) fclose($handle); प्रतिध्वनि $सामग्री;

PHP के साथ GET अनुरोध बनाना

अब हम HTTP और HTTPS के माध्यम से इंटरनेट से सामग्री डाउनलोड करने के लिए fread और file_get_contents का उपयोग करने पर ध्यान केंद्रित करेंगे। इस आलेख में वर्णित विधियों का उपयोग करने के लिए, आपको फॉपेन रैपर विकल्प को सक्षम करना होगा। ऐसा करने के लिए, आपको php.ini फ़ाइल में follow_url_fopen पैरामीटर को चालू पर सेट करना होगा।

PHP में POST और GET अनुरोध निष्पादित करने का उपयोग वेबसाइटों में लॉग इन करने, वेब पेज सामग्री पुनर्प्राप्त करने, या एप्लिकेशन के नए संस्करणों की जांच करने के लिए किया जाता है। हम देखेंगे कि सरल HTTP अनुरोध कैसे करें।

इंटरनेट पर फ़ाइलें डाउनलोड करने या प्राप्त करने के लिए फ़्रेड का उपयोग करना

याद रखें कि वेब पेज पढ़ना पैकेट के सुलभ हिस्से तक ही सीमित है। इसलिए आपको स्ट्रीम_गेट_कंटेंट्स फ़ंक्शन का उपयोग करने की आवश्यकता है ( file_get_contents के समान) या फ़ाइल के अंत तक पहुंचने तक सामग्री को छोटे टुकड़ों में पढ़ने के लिए थोड़ी देर का लूप:

PHP POST अनुरोध को संसाधित करने के इस मामले में, फ़्रेड फ़ंक्शन का अंतिम तर्क टुकड़े के आकार के बराबर है। यह आम तौर पर 8192 से अधिक नहीं होना चाहिए ( 8*1024 ).

उनमें जो समानता है वह यह है कि वे एक ही तरह से काम करते हैं। तकनीकी रूप से इनमें कोई अंतर नहीं है. लेकिन वैचारिक मतभेद हैं.

मैं PHP के संदर्भ में उनके बारे में बात करूंगा। कृपया ध्यान दें कि HTTP प्रोटोकॉल अप्रत्यक्ष रूप से PHP से संबंधित है क्योंकि यह html पृष्ठों के आदान-प्रदान के लिए बनाया गया था और PHP बस दोनों की क्षमताओं का विस्तार करता है।

GET अनुरोध का उपयोग डेटा प्राप्त करने के लिए किया जाता है और POST का उपयोग भेजने के लिए किया जाता है। (याद रखें कि तकनीकी रूप से वे एक जैसे ही काम करते हैं)।

इसलिए, PHP के संदर्भ में, इस विचारधारा के आधार पर, हमने निम्नलिखित कार्य किया:
1. हर बार जब आप PHP शुरू करते हैं, तो सुपरग्लोबल ऐरे ($_GET, $_POST) डिफ़ॉल्ट रूप से बनाए जाते हैं।
2. यदि क्वेरी स्ट्रिंग में कोई प्रश्न चिह्न(?) है। इसके बाद हर बात पर विचार किया जाता है पैरामीटरअनुरोध प्राप्त करें, उन्हें "कुंजी" = "मान" प्रारूप में प्रस्तुत किया जाता है और एम्परसेंड वर्ण (&) का उपयोग सीमांकक के रूप में किया जाता है।
उदाहरण:
/index.php?name=Andre&surname=Galkin प्राप्त करें
यह एक क्वेरी स्ट्रिंग है, इसमें 2 पैरामीटर हैं। ये पैरामीटर $_GET सरणी में जाएंगे।
3. $_POST को अलग तरीके से भरा जाता है. इस सरणी की सामग्री "अनुरोध शीर्षलेख" से भरी हुई है। अर्थात्, दृश्य से स्पष्ट रूप से छिपी हुई जगह से। ब्राउज़र ऐसे हेडर बनाने के सभी कामों का ध्यान रखता है। हालाँकि कभी-कभी शीर्षकों में मैन्युअल रूप से कुछ संपादित किया जाता है।

अधिकतर, पोस्ट अनुरोध का उपयोग फॉर्म (डेटा भेजने के लिए) में किया जाता है।

उदाहरण के लिए, हमारे पास 2 फ़ील्ड वाला एक लॉगिन फ़ॉर्म है: लॉगिन और पासवर्ड।

आइए कल्पना करें कि हम GET पद्धति का उपयोग कर रहे हैं। फिर, फॉर्म जमा करते समय, हम निम्नलिखित पते पर जाएंगे /login.php?login=Andree&password=123 आप सहमत होंगे कि इस तरह से ऐसी जानकारी प्रसारित करना बिल्कुल भी सुरक्षित नहीं है। कोई भी आपका ब्राउज़र खोल सकता है और, साइट का पता दर्ज करना शुरू करके, इतिहास से आपके पासवर्ड और लॉगिन देख सकता है।

लेकिन यदि हमने POST विधि निर्दिष्ट की है, तो हमें निम्नलिखित अनुरोध प्राप्त होगा:
POST /login.php (लॉगिन=एंड्रे&पासवर्ड=123) जो कोष्ठक में है वह छिपा होगा और ब्राउज़र में किसी भी तरह से सहेजा नहीं जाएगा।

इसको जोड़कर:
GET का अर्थ है एक विशिष्ट पृष्ठ प्राप्त करना एक निश्चित रूप(छँटाई, वर्तमान पृष्ठब्लॉग, खोज बार, आदि)।
पोस्ट - डेटा भेजने के लिए जो पृष्ठ के प्रदर्शन को प्रभावित नहीं करता है, इस अर्थ में कि यह डेटा केवल स्क्रिप्ट के परिणाम (लॉगिन, पासवर्ड, क्रेडिट कार्ड नंबर, संदेश इत्यादि) को प्रभावित करता है।

और एक और अच्छी खबर यह है कि, उदाहरण के लिए, उन्हें जोड़ा जा सकता है
पोस्ट /index.php?page=login (लॉगिन=एंड्रे&पासवर्ड=123) मुझे लगता है कि मैं पहले ही काफी समझा चुका हूं कि इससे क्या होगा और कौन से पैरामीटर किस ऐरे में जाएंगे।

में हाल ही मेंमैं मुख्य PHPClub फोरम पर POST और GET अनुरोध बनाने के विषय पर प्रश्न देख रहा हूं, साथ ही इस विषय पर प्रश्न भी देख रहा हूं: "मैं हेडर फ़ंक्शन का उपयोग करके POST अनुरोध कैसे उत्पन्न कर सकता हूं।" मेरा मानना ​​है कि उपयोग में "i" को डॉट करने की आवश्यकता है यह तकनीक, क्योंकि नौसिखिया प्रोग्रामर वेब के सिद्धांतों को बिल्कुल नहीं समझते हैं। तो, आइए HTTP प्रोटोकॉल की दुनिया के माध्यम से अपनी यात्रा शुरू करें।

1. HTTP प्रोटोकॉल. परिचय

मैं तुरंत एक छोटी सी बात स्पष्ट करना चाहूंगा।

भयानक शब्द प्रोटोकॉल कई लोगों के समझौते से ज्यादा कुछ नहीं है, बस एक अच्छे क्षण में लोगों ने फैसला किया: "चलो इसे इस तरह से करें, और फिर सब कुछ ठीक हो जाएगा।" डरने की कोई बात नहीं है, सब कुछ बस अपमानजनक है और हम अब इस अपमान का खुलासा करेंगे। तो, HTTP प्रोटोकॉल क्या है और इसका उपयोग किस लिए किया जाता है?

दुनिया में कोई चमत्कार नहीं है, खासकर प्रोग्रामिंग और इंटरनेट की दुनिया में!

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

हाँ, बहुत सरल! आपको बस थोड़ा आराम करने और प्रक्रिया का आनंद लेना शुरू करने की जरूरत है :-)

1.2. हमारा पहला HTTP अनुरोध लिखना

  • यदि आप सोचते हैं कि सब कुछ बहुत जटिल है, तो आप गलत हैं। मनुष्य को इस तरह से डिज़ाइन किया गया है कि वह कुछ भी जटिल बनाने में सक्षम नहीं है, अन्यथा वह स्वयं इसमें भ्रमित हो जाएगा :-) तो, एक ब्राउज़र है और एक वेब सर्वर है।
  • ब्राउज़र हमेशा डेटा विनिमय का आरंभकर्ता होता है। एक वेब सर्वर कभी भी किसी को कुछ भी नहीं भेजेगा, इसलिए वह ब्राउज़र को कुछ भेजता है - ब्राउज़र को इसके लिए पूछना होगा।
  • सबसे सरल HTTP अनुरोध इस तरह दिख सकता है:
  • http://www.php.net/ HTTP/1.0\r\n\r\n प्राप्त करें
प्राप्त करें (अंग्रेजी से अनुवादित का अर्थ है "प्राप्त करें") - अनुरोध का प्रकार भिन्न हो सकता है, उदाहरण के लिए पोस्ट, हेड, पुट, डिलीट (हम उनमें से कुछ को नीचे देखेंगे)। http://www.php.net/ - यूआरआई (पता) जिससे हम कम से कम कुछ जानकारी प्राप्त करना चाहते हैं (स्वाभाविक रूप से, हम HTML पेज सीखने की उम्मीद करते हैं)। HTTP/1.0 प्रोटोकॉल का प्रकार और संस्करण है जिसका उपयोग हम सर्वर के साथ संचार करते समय करेंगे।

\r\n पंक्ति का अंत है, जिसे दो बार दोहराया जाना चाहिए; क्यों थोड़ी देर बाद स्पष्ट हो जाएगा।

आप इस अनुरोध को बहुत सरलता से निष्पादित कर सकते हैं. Telnet.exe प्रोग्राम चलाएँ, होस्ट के रूप में www.php.net दर्ज करें, पोर्ट 80 निर्दिष्ट करें, और बस \r\n\r\n के रूप में दो बार Enter दबाकर यह अनुरोध टाइप करें। जवाब में आपको HTML कोड प्राप्त होगा

होम पेज साइट www.php.net.

  • 1.3 अनुरोध संरचनाआइए देखें कि HTTP अनुरोध में क्या शामिल है।
  • सब कुछ काफी सरल है. आइए इस तथ्य से शुरू करें कि HTTP अनुरोध एक पूरी तरह से सार्थक पाठ है। सामान्य स्थिति में इसमें क्या शामिल है? हम HTTP 1.0 प्रोटोकॉल पर विचार करेंगे. इसलिए:

  • अनुरोध-पंक्ति[सामान्य-शीर्षक | अनुरोध-शीर्षक | एंटिटी-हेडर ]\r\n[ एंटिटी-बॉडी ]
  • अनुरोध-पंक्ति- पैरामीटर के एक सेट के साथ किसी पृष्ठ का एक सापेक्ष या पूर्ण लिंक, उदाहरण के लिए, /index.html या http://www.myhost.ru/index.html या /index.html?a=1&b=qq।
  • बाद के मामले में, सर्वर को संबंधित मानों के साथ वेरिएबल ए और बी के सेट के साथ एक अनुरोध भेजा जाएगा, और "&" चिह्न - एक एम्परसेंड - मापदंडों के बीच एक विभाजक के रूप में कार्य करता है। HTTP-संस्करण

- HTTP प्रोटोकॉल का संस्करण, हमारे मामले में "HTTP/1.0"।

हम GET और POST प्रसंस्करण विधियों में अत्यधिक रुचि रखते हैं। GET विधि से आप बस स्क्रिप्ट में पैरामीटर पास कर सकते हैं, और POST विधि से आप फ़ॉर्म सबमिशन का अनुकरण कर सकते हैं। GET विधि के लिए, अनुरोध-URI इस तरह दिख सकता है:

  • "/index.html?param1=1¶m2=2"।जनरल-हेडर
    - शीर्षक का मुख्य भाग.
    प्रारूप:
  • केवल दो पैरामीटर हो सकते हैं: दिनांक या प्राग्मा। दिनांक - ग्रीनविच दिनांक "सप्ताह का दिन, दिन महीना वर्ष HH:MM:SS GMT" प्रारूप में, उदाहरण के लिए, "मंगलवार, 15 नवंबर 1994 08:12:31 GMT" - अनुरोध के निर्माण की तिथि।प्राग्मा में एकल नो-कैश मान हो सकता है, जो पेज कैशिंग को अक्षम कर देता है।

    अनुरोध हेडर - हेडर का वह भाग जो अनुरोध का वर्णन करता है।.
    अनुरोध-शीर्षलेख में निम्नलिखित पैरामीटर हो सकते हैं:

  • अनुमति दें, प्राधिकरण, से, यदि-संशोधित-चूंकि, संदर्भकर्ता, उपयोगकर्ता-एजेंटइस अध्याय में, हम प्राधिकरण पैरामीटर पर विचार नहीं करेंगे, क्योंकि इसका उपयोग निजी संसाधनों तक पहुंचने के लिए किया जाता है, जिसकी अक्सर आवश्यकता नहीं होती है।
    आप www.w3c.org पर स्वयं अधिकृत एक्सेस हेडर बनाना सीख सकते हैं।
    अनुमति दें
  • - स्वीकार्य प्रसंस्करण विधियां निर्धारित करता है। - प्रारूप: "अनुमति दें: प्राप्त करें | शीर्ष\n"।अनुरोध-पंक्ति में POST प्रसंस्करण विधि निर्दिष्ट करते समय पैरामीटर को अनदेखा कर दिया जाता है। स्वीकार्य अनुरोध प्रसंस्करण विधियों को निर्दिष्ट करता है।
    प्रॉक्सी सर्वर अनुमति पैरामीटर को संशोधित नहीं करते हैं और यह अपरिवर्तित सर्वर तक पहुंचता है।
    से मेल पताअनुरोध किसने भेजा.
  • प्रारूप: "प्रेषक: adderss\r\n"।उदाहरण के लिए, "से:
    [ईमेल सुरक्षित]
    \r\n"।
  • यदि संशोधित के बाद से- इंगित करता है कि अनुरोध को इतने समय से संशोधित नहीं किया गया है।
    प्रारूप: "यदि-संशोधित-चूंकि: दिनांक\r\n"
    केवल GET प्रसंस्करण विधि के लिए उपयोग किया जाता है। दिनांक GMT में उसी प्रारूप में निर्दिष्ट किया गया है जैसे सामान्य-शीर्षलेख में दिनांक पैरामीटर के लिए।
  • संदर्भ- उस पृष्ठ का एक पूर्ण लिंक जहां से अनुरोध शुरू किया गया था, यानी उस पृष्ठ का एक लिंक जहां से उपयोगकर्ता हमारे पास आया था।
    प्रारूप: "रेफ़रर: url\n"।
  • उदाहरण: "रेफ़रर: www.host.ru/index.html\n"।उपयोगकर्ता एजेंट
    अनुरोध का यह भाग उन मापदंडों को निर्दिष्ट करता है जो पृष्ठ के मुख्य भाग का वर्णन करते हैं। एंटिटी-हेडर में निम्नलिखित पैरामीटर हो सकते हैं: अनुमति दें, सामग्री-एन्कोडिंग, सामग्री-लंबाई, सामग्री-प्रकार, समाप्ति तिथि, अंतिम-संशोधित, एक्सटेंशन-हेडर.
  • अनुमति दें, प्राधिकरण, से, यदि-संशोधित-चूंकि, संदर्भकर्ता, उपयोगकर्ता-एजेंट- जनरल-हेडर से अनुमति के समान एक पैरामीटर।
  • सामग्री एन्कोडिंग- डेटा एन्कोडिंग प्रकार एंटिटी-बॉडी।
    प्रारूप: "सामग्री-एन्कोडिंग: x-gzip | x-कंप्रेस | अन्य प्रकार\n"।
    उदाहरण: "सामग्री-एन्कोडिंग: x-gzip\n"। "|" वर्ण शब्द का अर्थ है "या", अर्थात्, यह या वह या वह, आदि।
    एक अन्य प्रकार यह संकेत दे सकता है कि डेटा कैसे एन्कोड किया गया है, उदाहरण के लिए, POST विधि के लिए: "सामग्री-एन्कोडिंग: एप्लिकेशन/x-www-form-urlencoded\n"।
  • कंटेंट की लम्बाई- एंटिटी-बॉडी को भेजे गए बाइट्स की संख्या। सामग्री-लंबाई मान का MIME प्रारूप में भेजे गए डेटा के लिए एक पूरी तरह से अलग अर्थ है, जहां यह डेटा के एक हिस्से - "बाहरी/इकाई-शरीर" का वर्णन करने के लिए एक पैरामीटर के रूप में कार्य करता है।
    मान्य संख्याएँ शून्य और उससे ऊपर के पूर्णांक हैं।
  • उदाहरण: "सामग्री-लंबाई: 26457\n"।सामग्री-प्रकार
    - प्रेषित डेटा का प्रकार.
  • उदाहरण के लिए: "सामग्री-प्रकार: text/html\n"।समय-सीमा समाप्त
    - वह समय जब पेज को ब्राउज़र कैश से हटाया जाना चाहिए।
  • प्रारूप: "समाप्ति: दिनांक\n"। दिनांक प्रारूप जनरल-हेडर से दिनांक पैरामीटर के लिए दिनांक प्रारूप के समान है।अंतिम-संशोधित
    - प्रेषित डेटा के अंतिम परिवर्तन का समय।
  • प्रारूप: "अंतिम-संशोधित: दिनांक\n"। दिनांक प्रारूप जनरल-हेडर से दिनांक पैरामीटर के लिए दिनांक प्रारूप के समान है।एक्सटेंशन-हेडर
    - हेडर का भाग, जिसका उद्देश्य, उदाहरण के लिए, दस्तावेज़ प्राप्त करने वाले ब्राउज़र या अन्य प्रोग्राम द्वारा संसाधित किया जाना हो सकता है। इस भाग में, आप "पैरामीटरनाम: पैरामीटरवैल्यू\n" प्रारूप में अपने पैरामीटर का वर्णन कर सकते हैं। यदि क्लाइंट प्रोग्राम नहीं जानता कि उन्हें कैसे संसाधित किया जाए तो इन मापदंडों को नजरअंदाज कर दिया जाएगा।

उदाहरण के लिए: "कुकी: r=1\r\n" - पृष्ठ के लिए प्रसिद्ध कुकीज़ सेट करता है।

और अब, ऐसे भयानक शब्दों के बाद, आइए थोड़ा शांत होने की कोशिश करें और समझें कि हमें क्या चाहिए? स्वाभाविक रूप से, हम उदाहरणों से समझेंगे।

आइए कल्पना करें कि हमें कुकीज़ पास करके साइट से एक पृष्ठ प्राप्त करने की आवश्यकता है, अन्यथा हमें केवल बिन बुलाए मेहमान के रूप में भेजा जाएगा, और इसके अलावा, यह ज्ञात है कि आपको इस पृष्ठ तक पहुंचने की अनुमति केवल तभी दी जाती है जब आप मुख्य पृष्ठ पर जा चुके हों। साइट।

2 विधि प्राप्त करें

आइए अपना अनुरोध लिखें।
http://www.site.ru/news.html HTTP/1.0\r\n प्राप्त करें

होस्ट: www.site.ru\r\n
कुकी: आय=1\r\n

यह अनुरोध हमें बताता है कि हम GET विधि का उपयोग करके http://www.site.ru/news.html पर पृष्ठ की सामग्री प्राप्त करना चाहते हैं। होस्ट फ़ील्ड इंगित करता है कि यह पृष्ठ www.site.ru सर्वर पर स्थित है, रेफरर फ़ील्ड इंगित करता है कि हम साइट के मुख्य पृष्ठ से समाचार के लिए आए हैं, और कुकी फ़ील्ड इंगित करता है कि हमें ऐसी और ऐसी कुकी सौंपी गई थी। होस्ट, रेफरर और कुकी फ़ील्ड इतने महत्वपूर्ण क्यों हैं? क्योंकि सामान्य प्रोग्रामर, डायनामिक साइट बनाते समय, वेरिएबल के रूप में स्क्रिप्ट (PHP सहित) में दिखाई देने वाले डेटा फ़ील्ड की जांच करते हैं। यह किसलिए है? उदाहरण के लिए, साइट को लूटने से रोकने के लिए, यानी।

उन्होंने स्वचालित डाउनलोडिंग के लिए इस पर कोई प्रोग्राम सेट नहीं किया है, या इसलिए कि साइट पर आने वाला व्यक्ति हमेशा मुख्य पृष्ठ आदि से ही इस तक पहुंच सके।

अब आइए कल्पना करें कि हमें पृष्ठ पर फॉर्म फ़ील्ड भरने और फॉर्म से एक अनुरोध भेजने की आवश्यकता है, इस फॉर्म में दो फ़ील्ड होने दें: लॉगिन और पासवर्ड (लॉगिन और पासवर्ड) - और, निश्चित रूप से, हम लॉगिन जानते हैं और पासवर्ड।
http://www.site.ru/news.html HTTP/1.0\r\n प्राप्त करें
http://www.site.ru/news.html?login=Petya%20Vasechkin&password=qq HTTP/1.0\r\n प्राप्त करें
होस्ट: www.site.ru\r\n
कुकी: आय=1\r\n

सन्दर्भकर्ता: http://www.site.ru/index.html\r\n हमारा लॉगिन "पेट्या वासेकिन" है हमें पेट्या%20वासेकिन क्यों लिखना चाहिए? ऐसा इसलिए है क्योंकि विशेष वर्णों को सर्वर द्वारा नए पैरामीटर की उपस्थिति या अनुरोध के अंत आदि के संकेत के रूप में पहचाना जा सकता है। इसलिए, अनुरोध में त्रुटि स्थितियों से बचने के लिए पैरामीटर नाम और उनके मानों को एन्कोड करने के लिए एक एल्गोरिदम है।पूर्ण विवरण

इस एल्गोरिदम को पाया जा सकता है, और PHP में एन्कोडिंग और डिकोडिंग के लिए क्रमशः rawurlencode और rawurldecode फ़ंक्शन हैं। मैं यह नोट करना चाहूंगा कि यदि अनुरोध में एन्कोडेड पैरामीटर पारित किए गए थे तो PHP स्वयं डिकोडिंग करता है। यह HTTP प्रोटोकॉल के साथ मेरे परिचय का पहला अध्याय समाप्त करता है। अगले अध्याय में हम POST (अंग्रेजी से "भेजें" के रूप में अनुवादित) जैसे निर्माण अनुरोधों को देखेंगे, जो अधिक दिलचस्प होगा, क्योंकि यह अनुरोध का प्रकार है जिसका उपयोग HTML फॉर्म से डेटा भेजते समय किया जाता है।

3. पोस्ट विधि.

3.1 सामग्री-प्रकार: एप्लिकेशन/x-www-form-urlencoded।

हम लॉगिन और पासवर्ड स्थानांतरित करने के लिए हमारे GET अनुरोध के समान एक अनुरोध लिखते हैं, जिसकी चर्चा पिछले अध्याय में की गई थी:


http://www.site.ru/news.html HTTP/1.0\r\n प्राप्त करें
http://www.site.ru/news.html?login=Petya%20Vasechkin&password=qq HTTP/1.0\r\n प्राप्त करें
होस्ट: www.site.ru\r\n
सामग्री-प्रकार: एप्लिकेशन/x-www-form-urlencoded\r\n
सामग्री-लंबाई: 35\r\n
कुकी: आय=1\r\n

यहां हम सामग्री-प्रकार और सामग्री-लंबाई हेडर फ़ील्ड का उपयोग करने का एक उदाहरण देखते हैं। सामग्री-लंबाई बताती है कि डेटा क्षेत्र कितने बाइट्स पर कब्जा करेगा, जिसे हेडर से एक अन्य लाइन ब्रेक \r\n द्वारा अलग किया जाता है। लेकिन जो पैरामीटर पहले GET अनुरोध के लिए अनुरोध-यूआरआई में रखे गए थे, वे अब एंटिटी-बॉडी में हैं। देखा जा सकता है कि ये एक ही तरह से बने हैं, आपको बस इन्हें शीर्षक के बाद लिखना है। मैं एक और बात बताना चाहता हूंमहत्वपूर्ण बिंदु

, एंटिटी-बॉडी में मापदंडों के सेट के साथ-साथ अनुरोध-यूआरआई में अन्य नामों के साथ पैरामीटर रखने से कुछ भी नहीं रोकता है, उदाहरण के लिए:
.....
कुकी: आय=1\r\n
पोस्ट http://www.site.ru/news.html?type=user HTTP/1.0\r\n

लॉगिन=पेट्या%20वासेकिन&पासवर्ड=qq

3.2 सामग्री-प्रकार: मल्टीपार्ट/फॉर्म-डेटा

जैसे ही इंटरनेट की दुनिया को एहसास हुआ कि फ़ॉर्म के माध्यम से फ़ाइलें भेजना अच्छा होगा, W3C कंसोर्टियम ने POST अनुरोध प्रारूप को परिष्कृत करने के बारे में सोचा। उस समय तक, MIME प्रारूप (बहुउद्देशीय इंटरनेट मेल एक्सटेंशन - मेल संदेश उत्पन्न करने के लिए बहुउद्देश्यीय प्रोटोकॉल एक्सटेंशन) पहले से ही व्यापक रूप से उपयोग किया गया था, इसलिए, पहिया को फिर से आविष्कार न करने के लिए, हमने इस संदेश पीढ़ी प्रारूप के हिस्से का उपयोग करने का निर्णय लिया HTTP प्रोटोकॉल में POST अनुरोध।

इस प्रारूप और एप्लिकेशन/x-www-form-urlencoded प्रकार के बीच मुख्य अंतर क्या हैं?

मुख्य अंतर यह है कि एंटिटी-बॉडी को अब खंडों में विभाजित किया जा सकता है, जो सीमाओं (सीमा) द्वारा अलग किए जाते हैं। सबसे दिलचस्प बात यह है कि प्रत्येक अनुभाग में संग्रहीत डेटा का वर्णन करने के लिए उसका अपना हेडर हो सकता है, यानी।

एक अनुरोध में आप विभिन्न प्रकार का डेटा स्थानांतरित कर सकते हैं (जैसे कि एक मेल पत्र में, आप पाठ के साथ-साथ फ़ाइलें भी स्थानांतरित कर सकते हैं)।
http://www.site.ru/news.html HTTP/1.0\r\n प्राप्त करें
http://www.site.ru/news.html?login=Petya%20Vasechkin&password=qq HTTP/1.0\r\n प्राप्त करें
होस्ट: www.site.ru\r\n

तो चलो शुरू हो जाओ। आइए लॉगिन और पासवर्ड के स्थानांतरण के साथ फिर से उसी उदाहरण पर विचार करें, लेकिन अब एक नए प्रारूप में।
कुकी: आय=1\r\n
पोस्ट करें http://www.site.ru/news.html HTTP/1.0\r\n सामग्री-लंबाई: 209\r\n
--1BEF0A57BE110FD467A सामग्री-लंबाई: 209\r\n
सामग्री-लंबाई: 209\r\n
\r\n सामग्री-लंबाई: 209\r\n
पोस्ट करें http://www.site.ru/news.html HTTP/1.0\r\n सामग्री-लंबाई: 209\r\n
सामग्री-स्वभाव: प्रपत्र-डेटा; नाम = "लॉगिन" सामग्री-लंबाई: 209\r\n
सामग्री-लंबाई: 209\r\n
पेट्या वासेकिन सामग्री-लंबाई: 209\r\n
सामग्री-स्वभाव: प्रपत्र-डेटा; नाम = "पासवर्ड" सामग्री-लंबाई: 209\r\n

अब समझते हैं क्या लिखा है. :-) मैंने विशेष रूप से कुछ \r\n अक्षरों को बोल्ड में हाइलाइट किया है ताकि वे डेटा के साथ विलय न करें। यदि आप बारीकी से देखेंगे, तो आपको सामग्री-प्रकार के बाद सीमा क्षेत्र दिखाई देगा। यह फ़ील्ड अनुभाग विभाजक - सीमा निर्दिष्ट करती है। लैटिन अक्षरों और संख्याओं के साथ-साथ कुछ अन्य प्रतीकों (दुर्भाग्य से, मुझे याद नहीं है कि कौन से अन्य) से युक्त एक स्ट्रिंग का उपयोग बॉर्डर के रूप में किया जा सकता है। अनुरोध के मुख्य भाग में, सीमा की शुरुआत में "--" जोड़ा जाता है, और अनुरोध एक सीमा के साथ समाप्त होता है, जिसके अंत में "--" अक्षर भी जोड़े जाते हैं। हमारे अनुरोध में दो खंड हैं, पहला लॉगिन फ़ील्ड का वर्णन करता है, और दूसरा पासवर्ड फ़ील्ड का वर्णन करता है।

सामग्री-विस्थापन (अनुभाग में डेटा प्रकार) कहता है कि यह प्रपत्र से डेटा होगा, और नाम फ़ील्ड फ़ील्ड का नाम निर्दिष्ट करता है। यह वह जगह है जहां अनुभाग शीर्षलेख समाप्त होता है और इसके बाद अनुभाग डेटा क्षेत्र होता है जिसमें फ़ील्ड मान रखा जाता है (मान को एन्कोड करने की कोई आवश्यकता नहीं है!)।

मैं इस तथ्य पर आपका ध्यान आकर्षित करना चाहूंगा कि आपको सेक्शन हेडर में कंटेंट-लेंथ का उपयोग करने की आवश्यकता नहीं है, लेकिन अनुरोध हेडर में आपको ऐसा करना चाहिए और इसका मान संपूर्ण एंटिटी-बॉडी का आकार है, जो दूसरे के बाद दिखाई देता है। r\n निम्नलिखित सामग्री-लंबाई: 209\ r\n. वे। एंटिटी-बॉडी को एक अतिरिक्त लाइन ब्रेक द्वारा हेडर से अलग किया जाता है (जिसे अनुभागों में भी देखा जा सकता है)।

अब किसी फ़ाइल को स्थानांतरित करने के लिए अनुरोध लिखें।
http://www.site.ru/news.html HTTP/1.0\r\n प्राप्त करें
पोस्ट http://www.site.ru/postnews.html HTTP/1.0\r\n
होस्ट: www.site.ru\r\n
सन्दर्भकर्ता: http://www.site.ru/news.html\r\n
सामग्री-प्रकार: मल्टीपार्ट/फॉर्म-डेटा; सीमा=1BEF0A57BE110FD467A\r\n
कुकी: आय=1\r\n
पोस्ट करें http://www.site.ru/news.html HTTP/1.0\r\n सामग्री-लंबाई: 209\r\n
सामग्री-लंबाई: 491\r\n सामग्री-लंबाई: 209\r\n
सामग्री-लंबाई: 209\r\n
सामग्री-स्वभाव: प्रपत्र-डेटा; नाम = "न्यूज़_हेडर" सामग्री-लंबाई: 209\r\n
पोस्ट करें http://www.site.ru/news.html HTTP/1.0\r\n सामग्री-लंबाई: 209\r\n
उदाहरण समाचार सामग्री-लंबाई: 209\r\n
सामग्री-स्वभाव: प्रपत्र-डेटा; नाम = "news_file"; सामग्री-लंबाई: 209\r\n
फ़ाइल नाम = "news.txt" सामग्री-लंबाई: 209\r\n
सामग्री-लंबाई: 209\r\n
सामग्री-प्रकार: एप्लिकेशन/ऑक्टेट-स्ट्रीम सामग्री-लंबाई: 209\r\n
सामग्री-स्वभाव: प्रपत्र-डेटा; नाम = "पासवर्ड" सामग्री-लंबाई: 209\r\n

सामग्री-स्थानांतरण-एन्कोडिंग: बाइनरी

एक बहुत ही महत्वपूर्ण बिंदु. अधिकांश सीजीआई स्क्रिप्ट स्मार्ट लोगों द्वारा लिखी जाती हैं, इसलिए वे आने वाली फ़ाइल के प्रकार की जांच करना पसंद करते हैं, जो सामग्री-प्रकार में है। किस लिए? अक्सर, वेबसाइटों पर फ़ाइलें अपलोड करने का उपयोग विज़िटर से छवियां प्राप्त करने के लिए किया जाता है। इसलिए, ब्राउज़र स्वयं यह निर्धारित करने का प्रयास करता है कि विज़िटर किस प्रकार की फ़ाइल भेजना चाहता है और अनुरोध में उचित सामग्री-प्रकार सम्मिलित करता है। स्क्रिप्ट प्राप्त होने पर इसकी जाँच करती है, और, उदाहरण के लिए, यदि यह GIF या jpeg नहीं है, तो यह इस फ़ाइल को अनदेखा कर देती है। इसलिए, "मैन्युअल रूप से" अनुरोध बनाते समय, सामग्री-प्रकार मान का ध्यान रखें ताकि यह स्थानांतरित फ़ाइल के प्रारूप के सबसे करीब हो।

हमारे उदाहरण में, एक अनुरोध उत्पन्न होता है पाठ फ़ाइल. बाइनरी फ़ाइल को स्थानांतरित करने का अनुरोध उसी तरह उत्पन्न होता है।

4. पोस्टस्क्रिप्ट.

मुझे लगता है कि सर्वर पर अनुरोध भेजने के बारे में विस्तार से बात करना उचित नहीं है। यह शुद्ध आरएचपी तकनीक का मामला है :-)। सॉकेट के साथ काम करने के लिए फ़ंक्शंस, या आधिकारिक PHP दस्तावेज़ में CURL मॉड्यूल के फ़ंक्शंस पर अनुभाग को ध्यान से पढ़ना पर्याप्त है।

उपरोक्त से, मुझे आशा है कि अब यह स्पष्ट हो गया है कि प्रश्न क्यों है: "मैं हेडर फ़ंक्शन का उपयोग करके POST अनुरोध कैसे उत्पन्न कर सकता हूं?" - अर्थहीन.

हेडर (स्ट्रिंग) फ़ंक्शन केवल अनुरोध हेडर में एक प्रविष्टि जोड़ता है, लेकिन अनुरोध निकाय में नहीं।

अनुरोध का एक और प्रकार है - सामग्री-प्रकार: बहुखण्डीय/मिश्रित, मुझे आशा है कि इस लेख को पढ़ने के बाद आप इस प्रकार को स्वयं आसानी से समझ जायेंगे। आप इसका विस्तार से अध्ययन कर सकते हैं

यह पोस्ट मेरे एक लेख में पूछे गए प्रश्न का उत्तर है।

इस लेख में मैं आपको बताना चाहता हूं कि HTTP तरीके GET/POST/PUT/DELETE और अन्य क्या हैं, उनका आविष्कार क्यों किया गया और REST के अनुसार उनका उपयोग कैसे किया जाए।

HTTP

तो, इंटरनेट के मुख्य प्रोटोकॉल में से एक क्या है? मैं पेडेंट्स को RFC2616 पर भेजूंगा, और बाकी को मानवीय तरीके से बताऊंगा :)

यह प्रोटोकॉल दो कंप्यूटरों (क्लाइंट और सर्वर) के बीच की बातचीत का वर्णन करता है, जो अनुरोध (अनुरोध) और प्रतिक्रिया (प्रतिक्रिया) नामक संदेशों के आधार पर बनाया गया है। प्रत्येक संदेश में तीन भाग होते हैं: एक प्रारंभ पंक्ति, शीर्षलेख और एक मुख्य भाग। इस मामले में, केवल शुरुआती लाइन की आवश्यकता है।

अनुरोध और प्रतिक्रिया के लिए प्रारंभिक पंक्तियों के अलग-अलग प्रारूप हैं - हम केवल अनुरोध की प्रारंभिक पंक्ति में रुचि रखते हैं, जो इस तरह दिखती है:विधि उरी HTTP/ ,

संस्करण इस समयजहां METHOD HTTP अनुरोध विधि है, URI संसाधन पहचानकर्ता है, संस्करण प्रोटोकॉल संस्करण है (के लिए)

हेडर एक कोलन द्वारा अलग किए गए नाम-मूल्य जोड़े का एक संग्रह है। हेडर विभिन्न सेवा जानकारी देते हैं: संदेश एन्कोडिंग, ब्राउज़र नाम और संस्करण, पता जहां से ग्राहक आया (रेफ़रर), और इसी तरह।

संदेश का मुख्य भाग प्रेषित किया जा रहा वास्तविक डेटा है। प्रतिक्रिया में, प्रेषित डेटा, एक नियम के रूप में, ब्राउज़र द्वारा अनुरोधित HTML पृष्ठ होता है, और अनुरोध में, उदाहरण के लिए, संदेश के मुख्य भाग में, सर्वर पर अपलोड की गई फ़ाइलों की सामग्री प्रसारित होती है। लेकिन एक नियम के रूप में, अनुरोध में कोई संदेश निकाय नहीं है।

HTTP इंटरेक्शन उदाहरण

आइए एक उदाहरण देखें.

अनुरोध:
प्राप्त करें /index.php HTTP/1.1 होस्ट: example.com उपयोगकर्ता-एजेंट: मोज़िला/5.0 (X11; U; Linux i686; ru; rv:1.9b5) गेको/2008050509 फ़ायरफ़ॉक्स/3.0b5 स्वीकार करें: टेक्स्ट/html कनेक्शन: बंद करें
पहली पंक्ति क्वेरी लाइन है, बाकी हेडर हैं; संदेश का मुख्य भाग गायब है

उत्तर:
HTTP/1.0 200 OK सर्वर: nginx/0.6.31 सामग्री-भाषा: ru सामग्री-प्रकार: टेक्स्ट/html; charset=utf-8 सामग्री-लंबाई: 1234 कनेक्शन: बंद करें... HTML पृष्ठ स्वयं...

संसाधन और तरीके

आइए अनुरोध की प्रारंभिक पंक्ति पर लौटें और याद रखें कि इसमें यूआरआई जैसा पैरामीटर शामिल है। यह यूनिफ़ॉर्म रिसोर्स आइडेंटिफ़ायर के लिए है - एक समान संसाधन पहचानकर्ता। एक संसाधन, एक नियम के रूप में, सर्वर पर एक फ़ाइल है (इस मामले में एक उदाहरण यूआरआई "/styles.css") है, लेकिन सामान्य तौर पर एक संसाधन कुछ अमूर्त वस्तु भी हो सकता है ("/blogs/webdev/" - अंक किसी विशिष्ट फ़ाइल के बजाय "वेब" ब्लॉक डेवलपमेंट" पर)।

HTTP अनुरोध प्रकार (जिसे HTTP विधि भी कहा जाता है) सर्वर को बताता है कि हम संसाधन पर क्या कार्रवाई करना चाहते हैं। प्रारंभ में (90 के दशक की शुरुआत में) यह माना जाता था कि ग्राहक किसी संसाधन से केवल एक ही चीज़ चाहता है - उसे प्राप्त करना, लेकिन अब HTTP प्रोटोकॉल का उपयोग करके आप पोस्ट बना सकते हैं, प्रोफ़ाइल संपादित कर सकते हैं, संदेश हटा सकते हैं और बहुत कुछ कर सकते हैं। और इन कार्रवाइयों को "रसीद" शब्द के साथ जोड़ना मुश्किल है।

HTTP विधियों के स्तर पर संसाधनों से क्रियाओं को अलग करने के लिए, निम्नलिखित विकल्पों का आविष्कार किया गया:

  • प्राप्त करें - एक संसाधन प्राप्त करना
  • पोस्ट - संसाधन निर्माण
  • PUT - संसाधन अद्यतन
  • हटाएँ - संसाधन हटाना
कृपया ध्यान दें कि HTTP विनिर्देश के लिए सर्वर को सभी तरीकों को समझने की आवश्यकता नहीं है (जिनमें से वास्तव में 4 से अधिक हैं) - केवल GET की आवश्यकता है, और यह सर्वर को यह भी नहीं बताता है कि किसी विशेष के साथ अनुरोध प्राप्त करते समय उसे क्या करना चाहिए तरीका। इसका मतलब है कि सर्वर DELETE /index.php HTTP/1.1 अनुरोध के जवाब में बाध्य नहींसर्वर पर Index.php पेज हटाएं, GET /index.php HTTP/1.1 अनुरोध के समान बाध्य नहींआपको Index.php पेज लौटाएं, उदाहरण के लिए इसे हटाया जा सकता है :)

REST खेल में आता है

REST (रिप्रेजेंटेशनल स्टेट ट्रांसफर) 2000 में HTTP प्रोटोकॉल के डेवलपर्स में से एक, रॉय फील्डिंग द्वारा वेब अनुप्रयोगों के निर्माण के लिए सिद्धांतों के एक समूह के नाम के रूप में पेश किया गया एक शब्द है। सामान्य तौर पर, REST HTTP की तुलना में एक व्यापक क्षेत्र को कवर करता है - इसका उपयोग अन्य प्रोटोकॉल के साथ अन्य नेटवर्क में भी किया जा सकता है। REST "संसाधन" और "क्रिया" (विषय और विधेय के रूप में समझा जा सकता है) की अवधारणाओं के आधार पर क्लाइंट और सर्वर के बीच बातचीत के सिद्धांतों का वर्णन करता है। HTTP के मामले में, संसाधन की पहचान उसके URI द्वारा की जाती है, और क्रिया HTTP विधि है।

REST विभिन्न संसाधनों के लिए एक ही URI के उपयोग को छोड़ने का सुझाव देता है (अर्थात, दो अलग-अलग लेखों के पते जैसे /index.php?article_id=10 और /index.php?article_id=20 - यह REST-तरीका नहीं है) और विभिन्न कार्यों के लिए विभिन्न HTTP विधियों का उपयोग करना। अर्थात्, REST दृष्टिकोण का उपयोग करके लिखा गया एक वेब एप्लिकेशन किसी संसाधन को HTTP DELETE पद्धति से एक्सेस करते समय हटा देगा (बेशक, इसका मतलब यह नहीं है कि सब कुछ और सभी को हटाने का अवसर देना आवश्यक है, लेकिन कोईएप्लिकेशन के डिलीट अनुरोध को HTTP DELETE विधि का उपयोग करना चाहिए)।

REST प्रोग्रामर्स को पहले की तुलना में मानकीकृत और थोड़ा सुंदर वेब एप्लिकेशन लिखने की क्षमता देता है। REST का उपयोग करते हुए, एक नया उपयोगकर्ता जोड़ने के लिए URI /user.php?action=create (GET/POST विधि) नहीं होगा, बल्कि केवल /user.php (सख्ती से POST विधि) होगा।

परिणामस्वरूप, मौजूदा HTTP विनिर्देश और REST दृष्टिकोण के संयोजन से, विभिन्न HTTP विधियाँ अंततः समझ में आती हैं। GET - एक संसाधन लौटाता है, POST - एक नया बनाता है, PUT - किसी मौजूदा को अपडेट करता है, DELETE - इसे हटा देता है।

समस्याएँ?

हां, व्यवहार में REST का उपयोग करने में एक छोटी सी समस्या है। इस समस्या को HTML कहा जाता है.

PUT/DELETE अनुरोधों को XMLHttpRequest का उपयोग करके, सर्वर से मैन्युअल रूप से संपर्क करके (जैसे, कर्ल के माध्यम से या टेलनेट के माध्यम से) भेजा जा सकता है, लेकिन आप एक HTML फॉर्म नहीं बना सकते हैं जो पूर्ण PUT/DELETE अनुरोध भेजता है।

बात यह है कि, HTML विनिर्देश आपको GET या POST के अलावा अन्य डेटा सबमिट करने वाले फॉर्म बनाने की अनुमति नहीं देता है। इसलिए, अन्य तरीकों के साथ सामान्य रूप से काम करने के लिए, आपको कृत्रिम रूप से उनका अनुकरण करना होगा। उदाहरण के लिए, रैक में (वह तंत्र जिसके आधार पर रूबी वेब सर्वर के साथ इंटरैक्ट करती है; रेल, मर्ब और अन्य रूबी फ्रेमवर्क रैक का उपयोग करके बनाए जाते हैं), आप "_method" नाम के साथ फॉर्म में एक छिपा हुआ फ़ील्ड जोड़ सकते हैं, और मान के रूप में विधि का नाम निर्दिष्ट करें (उदाहरण के लिए "PUT") - इस मामले में, एक POST अनुरोध भेजा जाएगा, लेकिन रैक यह दिखावा करने में सक्षम होगा कि उसे POST के बजाय PUT प्राप्त हुआ है।