무언가로 간단하게 시작할 수 있습니다 : 필드가 에코 된 양식.Rebol 3에 "Hello, World"CGI를 쓰는 방법은 무엇입니까?
답변
이 글을 쓰고있는 현재 (2013-01) Rebol 3에는 여전히 Rebol 2와 번들 된 몇 가지 CGI 지원 기능이 부족합니다. 그러나 CGI 지원을 해킹하는 것이 좋습니다. 여전히 곧바로 나갑니다.
시작하기 전에 CGI를 실행하려는 컴퓨터에 R3 바이너리를 저장해야하며 간단하게하기 위해 저장 한 위치의 전체 경로를 알아야합니다. 다음 예제는 R3 바이너리가있는 유닉스 스타일의 머신이 /usr/local/bin/rebol3
이라고 가정합니다.
"Hello, World!"메시지를 보내려는 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!"
]
이것은 R2에서 작성한 것과 동일합니다.
조금 더 흥미로운 내용으로 : 요청한대로 HTML 양식 제출을 읽고 구문 분석합니다.
이렇게하려면 CGI에 대해 두 가지를 알아야합니다. 제출 된 데이터는 CGI에 표준 입력으로 전달됩니다. 다른 CGI 특정 정보는 환경 변수를 통해 웹 서버에서 전달됩니다. 우리는 system/ports/input
포트를 통해 R3의 입력 데이터에 액세스하고 get-env
네이티브를 사용하여 환경 변수를 읽을 수 있습니다.
HTML 양식 자체를 CGI에 포함시키고 CGI에서 모드 전환을 시도해 보겠습니다. 제출 된 데이터가없는 경우 HTML 양식을 표시하십시오. 데이터가 제출 된 경우이를 처리하고 적절한 응답을 표시하십시오. 우리는 HTTP 메소드 POST를 통해 데이터를 제출하는 양식을 작성한 다음 HTTP 메소드 GET (데이터 없음) 또는 POST (양식 데이터)를 통해 호출되었는지 여부를 CGI에서 점검함으로써이를 수행 할 수 있습니다. 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에는 Rebol 3이 현재 가지고 있지 않은 decode-cgi
도우미 기능이 있습니다.
그러나 기본 양식의 경우 CGI 데이터가 &
인 필드와 =
인 필드의 이름 및 값을 구분하는 인코딩으로 보내면됩니다. 모든 것이 URL로 인코딩됩니다. 따라서 위의 양식을 "Charlie"값과 함께 제출하면 CGI는 field=Charlie
을 입력으로받습니다. "Foo Bar"를 전송하면 "field = Foo % 20Bar"가 전송됩니다. 다시 말하지만, 기본 양식의 경우 위에 표시된 것처럼 parse ... "&="
(필드 및 필드 이름과 값 분할 용)과 dehex
(URL 인코딩 디코딩 용)의 조합이면 충분합니다.
Rebol 2 (http://www.rebol.com/docs/apache-cgi.html)에 설명 된 방법을 시도해 보셨습니까? 그렇다면 프로세스에서 벽을 치는 위치는 어디입니까? – HostileFork