2013-01-02 6 views

답변

11

이 글을 쓰고있는 현재 (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 인코딩 디코딩 용)의 조합이면 충분합니다.

+0

좋습니다. 고맙습니다. 내가 알고 싶은 모든 것을 다룹니다. – dt2

+4

http://reb4.me/r/r3webform - ('load-webform'과'to-webform') R3에 내 WebForm 디코더를 포팅했습니다. 'decode-cgi'보다 조금 더 나아가고 더 깊은 데이터 구조를 만들 것입니다. 예를 들어,'load-webform "a.a = A & a.b = B"'. – rgchris

+2

R3 Web Form en/decoder가 http://reb4.me/r3/altwebform – rgchris