2013-01-02 19 views
8

चलिए कुछ सरल से शुरू करते हैं: एक फ़ील्ड वाला एक फॉर्म जो प्रतिबिंबित हो जाता है।रीबोल 3 के साथ "हैलो, वर्ल्ड" सीजीआई कैसे लिखें?

+0

क्या आपने विधि [रीबोल 2 के लिए वर्णित] की कोशिश की है (http://www.rebol.com/docs/apache-cgi.html)? यदि हां, तो आपने प्रक्रिया में कहां दीवार मारा? – HostileFork

उत्तर

11

इस लेखन (2013-01) के समय, रेबोल 3 में अभी भी कुछ सीजीआई-सहायक कार्यों की कमी है जो कि रीबोल 2 के साथ बंडल किए गए थे। हालांकि, अगर आप लापता सीजीआई का समर्थन करते हुए हैकिंग के साथ ठीक हैं, तो आप कर सकते हैं अभी भी तुरंत जा रहे हैं।

इससे पहले कि हम शुरू करते हैं, आप मशीन आप अपने सीजीआई चलाना चाहते हैं पर R3 द्विआधारी स्टोर करने के लिए की जरूरत है, और आप जहां आप इसे (सादगी की खातिर) संग्रहीत करने के लिए पूरा पथ पता करने की जरूरत। निम्नलिखित उदाहरण यूनिक्स-शैली मशीन को /usr/local/bin/rebol3 में R3 बाइनरी के साथ मानते हैं।

आइए आपके अनुरोध के मुकाबले कुछ और आसान से शुरू करें: एक CGI बस "हैलो, वर्ल्ड!" भेज रहा है पृष्ठ:

#!/usr/local/bin/rebol3 -cs 
REBOL [] 
prin [ 
    "Content-type: text/html" crlf 
    crlf 
    <!doctype html> 
    <title> "Rebol 3 CGI Sample: Hello" </title> 
    "Hello, World!" 
] 

यह आर 2 में आप जो लिखना चाहते हैं उसके समान है।

कुछ और दिलचस्प दिलचस्प: जैसा कि आपने अनुरोध किया है, एक HTML फॉर्म सबमिशन को पढ़ना और पार्स करना।

इसके लिए हमें सीजीआई के बारे में दो चीजें जाननी चाहिए: सबमिट किया गया डेटा सीजीआई को मानक इनपुट के रूप में पास किया गया है; अन्य CGI- विशिष्ट जानकारी वेबसर्वर से पर्यावरण चर के माध्यम से पारित की जाती है। हम system/ports/input पोर्ट के माध्यम से R3 में इनपुट डेटा तक पहुंच सकते हैं, और get-env मूल का उपयोग करके पर्यावरण चर पढ़ सकते हैं।

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

#!/usr/local/bin/rebol3 -cs 
REBOL [] 

handle-get: function [] [ 
    prin [ 
     "Content-type: text/html" crlf 
     crlf 
     <!doctype html> 
     <title> "Rebol 3 CGI Sample: Form" </title> 
     <form method="POST"> 
      "Your name:" 
      <input type="text" name="field"> 
      <input type="submit"> 
     </form> 
    ] 
] 

handle-post: function [] [ 
    data: to string! read system/ports/input 
    fields: parse data "&=" 
    value: dehex select fields "field" 
    prin [ 
     "Content-type: text/html" crlf 
     crlf 
     <!doctype html> 
     <title> "Rebol 3 CGI Sample: Response" </title> 
     "Hello," (join value "!") 
    ] 
] 

main: does [ 
    switch get-env "REQUEST_METHOD" [ 
     "GET" [handle-get] 
     "POST" [handle-post] 
    ] 
] 

main 

इस स्क्रिप्ट को समझने के लिए अंतिम टुकड़ा वास्तव में सीजीआई के लिए भेजा HTML प्रपत्र डेटा पार्स करने के लिए कैसे:

कि सभी ने कहा कि के साथ, यहां आगे की हलचल के बिना पूर्ण स्क्रिप्ट है। Rebol 2 के लिए decode-cgi सहायक कार्य था, जिसमें वर्तमान में Rebol 3 की कमी है।

हालांकि, बुनियादी रूपों के लिए, यह पता चला है कि सीजीआई डेटा एन्कोडिंग कि = साथ & साथ खेतों और क्षेत्र का नाम और मूल्य अलग से भेजी गई है पर्याप्त होता; हमेशा यूआरएल-एन्कोडेड है। इसलिए यदि हम "चार्ली" के मूल्य के साथ ऊपर एम्बेड किए गए फॉर्म को सबमिट करते हैं, तो CGI को इनपुट के रूप में field=Charlie प्राप्त होगा। सबमिट करना "फू बार" भेजता है "फ़ील्ड = फू% 20 बार"। तो, फिर से: मूल रूपों के लिए, ऊपर दिखाए गए अनुसार parse ... "&=" (फ़ील्ड और फ़ील्ड नामों और मानों को विभाजित करने के लिए) और dehex (URL-एन्कोडिंग को डीकोड करने के लिए) का संयोजन पर्याप्त होगा।

+0

ग्रेट, धन्यवाद। मैं जो कुछ जानना चाहता था उसे कवर करता है :) – dt2

+4

मैंने अपने वेबफॉर्म डिकोडर को R3 पर पोर्ट किया: http://reb4.me/r/r3webform - ('load-webform' और 'to-webform')। 'डीकोड-सीजीआई 'से थोड़ा आगे जाता है और गहरी डेटा संरचनाएं बनाएगा, उदाहरण:' लोड-वेबफॉर्म" a.a = ए और ए.बी = बी "'। – rgchris

+2

आर 3 वेब फॉर्म एन/डीकोडर अब http://reb4.me/r3/altwebform – rgchris

संबंधित मुद्दे