2013-01-02 60 views
8

讓我們從簡單的事情開始吧:一個帶有迴應字段的表單。如何用Rebol 3編寫「Hello,World」CGI?

+0

您是否嘗試過[如Rebol 2](http://www.rebol.com/docs/apache-cgi.html)所述的方法?如果是這樣,那麼你在這個過程中的哪個地方碰到了牆? – HostileFork

回答

11

在撰寫本文時(2013-01),Rebol 3仍然缺少與Rebol 2捆綁在一起的少數支持CGI的功能。但是,如果您自己擅自修改缺失的CGI支持,您可以仍然馬上開始。

在我們開始之前,您需要將R3二進制文件存儲在要運行CGI的計算機上,並且您需要知道存儲位置的完整路徑(爲了簡單起見)。以下示例假定在/usr/local/bin/rebol3中具有R3二進制文件的Unix式機器。

讓我們從比您要求更簡單的開始吧:CGI只是發送一個「Hello,World!」頁面:

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

這與您在R2中編寫的內容完全相同。

輾轉東西稍微更有趣:讀取和解析一個HTML表單提交,按照您的要求。爲此,我們需要知道關於CGI的兩件事情:提交的數據作爲標準輸入傳遞給CGI;其他CGI特定的信息通過環境變量從Web服務器傳遞。我們可以通過system/ports/input端口訪問R3中的輸入數據,並使用get-env本機讀取環境變量。讓我們將HTML表單本身嵌入到CGI中,並在CGI中進行模式切換:如果沒有提交數據,則顯示HTML表單;如果數據被提交,處理它並顯示適當的響應。我們可以通過編寫一個通過HTTP方法POST提交數據的表單,然後在CGI中檢查它是否通過HTTP方法GET(無數據)或POST(表單數據)進行調用。 CGI腳本調用的方法可通過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 

最後一塊理解這個腳本是如何實際解析發送到CGI HTML表單數據。 Rebol 2有一個decode-cgi輔助功能,目前Rebol 3缺乏。

但是,對於基本形式,只需知道CGI數據是以編碼的形式發送的,該編碼將&和字段的名稱和值與=分開; everthing是URL編碼的。因此,如果我們提交上面嵌入的值爲「Charlie」的表單,CGI將收到field=Charlie作爲輸入。提交「Foo Bar」發送「field = Foo%20Bar」。因此,再次說明:對於基本表單,如上所示,parse ... "&="(用於分割字段和字段名稱和值)和dehex(用於解碼URL編碼)的組合就足夠了。

+0

太好了,謝謝。涵蓋了我想知道的所有內容:) – dt2

+4

我將WebForm解碼器移植到R3:http://reb4.me/r/r3webform - ('load-webform'和'to-webform')。比'decode-cgi'更進一步,它將構建更深的數據結構,例如:'load-webform「a.a = A&a.b = B」'。 – rgchris

+2

R3 Web表單編解碼器現在位於http://reb4.me/r3/altwebform – rgchris