讓我們從簡單的事情開始吧:一個帶有迴應字段的表單。如何用Rebol 3編寫「Hello,World」CGI?
回答
在撰寫本文時(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編碼)的組合就足夠了。
- 1. 如何在spring scala中編寫hello world
- 2. 編譯Hello World
- 3. 編寫程序打印「Hello,world!」程序
- 4. 如何使用Python編寫「Hello World」RESTful API然後使用它
- 5. OpenShift 3 Tomcat Hello World示例
- 6. 如何編寫適用於OpenWRT和/或dd-wrt的Hello World
- 7. 如何用純erlang編寫簡單的hello-world web服務器
- 8. 如何使用Python 2.7在AWS Lambda中編寫hello world示例?
- 9. 如何編寫Hello World iWarp應用程序?
- 10. python print「hello world」vs「hello world」
- 11. 如何在Windows下編譯hello world?
- 12. 如何編譯這個hello world OS?
- 13. 如何爲「熱部署者/替代者」編寫hello world?
- 14. 如何爲Protege 5編寫hello world插件?
- 15. Noob OPC指南:如何編寫C#Hello World客戶端?
- 16. 如何爲linux編寫一個Hello world驅動程序
- 17. 編譯jruby「Hello world」問題
- 18. 編譯MPI/VTK Hello World
- 19. iPhone流編程(CFStream)Hello World
- 20. 的 「Hello world」 在ARM彙編
- 21. 你如何爲Rebol 3編寫編解碼器?
- 22. Android Hello World Exception
- 23. erlang boss_db hello world?
- 24. lauch4j hello world program
- 25. Hello World C++
- 26. JavaScriptCore Hello world nightly
- 27. Android PHP Hello World
- 28. Hello-World的FileProvider
- 29. AS3 Filesystem Hello World
- 30. React-Typescript Hello World
您是否嘗試過[如Rebol 2](http://www.rebol.com/docs/apache-cgi.html)所述的方法?如果是這樣,那麼你在這個過程中的哪個地方碰到了牆? – HostileFork