이번 강의를 시작으로 CGI 프로그래밍 학습 과정에 들어갑니다. 이전 강의를 통해 CGI 프로그래밍의 기본 지식을 마스터하셨습니다. 이제 앉아서 CGI 프로그램을 작성할 수 있습니다!
3. CGI 프로그래밍
1. 서버측 연결(SSI) 및 게이트웨이
2. 게이트웨이: WEB을 통해 다른 프로토콜을 연결합니다.
CGI 프로그램을 작성하는 과정에서 다음 응용 프로그램 설계 사항을 따르는 것이 가장 좋습니다.
(1) 질문 - 해결하고 싶은 문제
(2) 디자인 단계 - CGI 프로그램의 기본 틀과 기능을 구상한다.
(3) 코딩 단계 - 아이디어를 행동으로 구현
(4) 프로그램 이식 - 이식 가능한 코드 작성
(5) 우수성을 위해 노력하여 프로그램을 더 높은 수준으로 끌어올립니다.
1. 서버측 연결(SSI) 및 게이트웨이
이 섹션에서는 서버 측 연결 SSI(서버 측 포함) 및 게이트웨이를 소개합니다. 엄밀히 말하면 SSI는 CGI 프로그래밍의 일부가 아니지만 SSI는 간단한 CGI 프로그램이 수행할 수 있는 일부 작업을 수행할 수 있으며 때로는 SSI가 최선의 선택이기도 합니다. 그러므로 여기서는 간략한 소개를 한다.
SSI는 HTML 텍스트에 포함된 명령 집합을 정의합니다. HTML 텍스트가 HTTP 클라이언트로 전송되기 전에 웹 서버는 이러한 SSI 명령을 사전 처리하고 처리된 HTML 텍스트를 HTTP 클라이언트의 브라우저에 출력합니다.
SSI의 명령 형식은 다음과 같습니다.
< !--# 명령 매개변수="값" -->
SSI 명령은 클라이언트 측이 아닌 서버 측에서 처리된다는 점에서 Java 또는 JavaScript와 다릅니다. 이는 CGI 프로그램과 유사합니다. 물론 SSI의 기능적 범위 내에서는 서버의 리소스 활용도를 향상시킬 수 있으며 클라이언트의 모든 웹 브라우저에서 SSI가 포함된 HTML 텍스트를 탐색할 수 있다는 장점이 있습니다.
다음은 일반적으로 사용되는 6가지 SSI 명령입니다.
(1) 포함 명령
(2) 에코 명령
(3) 실행 명령
(4) 구성 명령
(5) fsize 명령
(6) flashmod 명령
포함 명령
지원되는 유일한 매개변수는 file 매개변수로 지정된 파일의 내용을 현재 HTML 텍스트에 삽입하는 file입니다. C 언어를 아시는 분이라면 C 언어의 "#include" 명령과 동일한 기능을 가지고 있음을 아실 수 있습니다. 예를 들어, main.html과 header.html이라는 두 개의 HTML 텍스트가 있습니다. main.html에서 include 명령을 사용하십시오.
<html>
<tilte> SSI 명령 포함 테스트 </ /title>
< !--#include 파일="header.html" -->
<본문>
위 헤더는 header.html에서 가져온 것입니다!
< /본문>
< /html>
헤더.html:
< H1> 이것은 header.html의 제목입니다. < /H1>
(단, OmniHTTPD에서는 include 명령을 지원하지 않는 것 같습니다. :< !)
에코 명령
지원되는 유일한 매개변수는 서버 제공 변수를 표시하는 데 사용되는 var입니다. 예를 들면 다음과 같습니다.
DOCUMENT_NAME: 현재 파일 이름
DOCUMENT_URL: SSI 텍스트의 상대 경로
DATE_LOCAL: 현지 날짜
DATE_GMT: GMT(크린위치 표준시) 날짜
LAST_MODIFIED: 이 SSI 명령이 포함된 파일의 마지막 수정 날짜
HTTP_USER_AGENT: 브라우저 이름.
예: main.shtml <html>
이 문서는 < !--#echo var="LAST_MODIFIED"-->에 마지막으로 업데이트되었습니다.
< /html>
브라우저로 main.shtml을 열면 마지막으로 수정된 시간을 볼 수 있습니다. (main.shtml은 OmniHTTPD의 HtDocs 디렉토리에 저장되어야 하며 http://localhost/main.shtml 주소를 사용하여 브라우저에서 액세스해야 한다는 점에 유의해야 합니다.)
실행 명령
두 매개변수는 cgi와 cmd입니다. 전자는 cgi="/cgi-bin/finger.cgi"와 같은 실행 파일을 호출하고, 후자는 cmd="ls"와 같은 시스템 명령을 호출합니다. 불행하게도 OmniHTTPD는 이 SSI 명령을 지원하지 않습니다(현재 최신 버전에서는 지원될 수도 있음).
구성 명령
이 명령은 서버가 파일을 처리하고 날짜를 표시하는 방식을 설정합니다. 여기에는 두 가지 매개변수가 있습니다.
(1) timefmt는 날짜 표시 형식을 결정합니다. 사용 가능한 값을 쿼리하려면 UNIX에서 man strftime을 사용하세요.
(2) sizefmt는 파일 길이를 표시하기 위한 형식을 결정합니다. 값은 바이트 또는 addrev입니다. 이 명령은 OmniHTTPD에서도 지원되지 않습니다.
fsize 명령
이 명령은 주어진 파일의 크기를 표시합니다. 매개변수는 file이며, 파일의 경로와 파일 이름을 지정합니다.
flashmod 명령
이 명령은 지정된 파일의 마지막 수정 날짜를 표시합니다. 매개변수는 file이며, 파일의 경로와 파일 이름을 지정합니다.
2. 게이트웨이: WEB을 통해 다른 프로토콜을 연결합니다.
HTTP 프로토콜은 인터넷의 모든 리소스에 액세스할 수 없습니다. HTTP 프로토콜 이외의 리소스(예: 이메일을 보내고 받기 위한 POP3 및 SMTP)에 액세스하려면 게이트웨이가 필요합니다. CGI 프로그램은 게이트웨이를 구현하는 좋은 방법입니다.
일반적으로 사용되는 일부 게이트웨이는 Finger, wais, Archie 등과 같은 많은 UNIX HTTP 서버에서 제공됩니다. 하지만 OmniHTTPD에서는 이러한 게이트웨이가 제공되지 않습니다. 하지만 CGI 프로그램을 작성하여 OmniHTTPD에 게이트웨이 기능을 추가할 수 있습니다.
양식 및 처리
HTML 양식은 웹 문서의 일부이며 사용자가 입력한 정보를 서버에 제출하는 데 사용됩니다. 일반적으로 이 정보는 CGI 프로그램으로 전달되는데, CGI 프로그램은 입력된 정보를 기반으로 일련의 작업이나 데이터 처리를 수행한 후 처리 결과를 나타내는 HTML 문서를 생성하여 클라이언트의 브라우저로 다시 보냅니다.
CGI 프로그램의 핵심 부분은 입력 데이터를 얻고 HTML 문서를 생성하는 것이지만 작업 및 데이터 처리 부분은 대부분의 응용 프로그램과 동일하다는 것을 알 수 있습니다. 이번 강의에서는 Perl과 Delphi에서 데이터를 얻어 HTML 문서를 출력하는 방법을 소개하겠습니다.
먼저 Greeting.html이라는 HTML 문서를 만듭니다.
Greeting.html 파일(OmniHTTPD의 HtDocs 디렉토리에 저장됨)
<html>
<머리>
<title>인사말 페이지입니다</title>
< h1> 인사말 </ /h1>
<본문>
<시간>
< 형식 action="/cgi-bin/greeting.pl" 방법=POST>
< p> 귀하의 이름: < input type=text name="firstname" size=60 maxlength=80> < /p>
< p> 성: < input type=text name="lastname" size=60 maxlength=80> < /p>
<시간>
< p> < 입력 유형=제출 값="모두 OK!"> < 입력 유형=값 재설정="모두 지우기"> </ /p>
< /양식>
< /본문>
< /html>
다음은 Perl CGI 프로그램 Greeting.pl입니다.
Greeting.pl 파일(OmniHTTPD의 cgi-bin 디렉토리에 저장됨) # 인사말입니다!
"cgi-lib.pl"이 필요합니다.
# ===================================
# 입력값을 얻는다
&ReadParse(*입력);
$mFirstName = $input{'이름'};
$mLastName = $input{'성'};
# ===================================
# 여기서 몇 가지 작업을 수행합니다.
$mFullName = "$mFirstName $mLastName";
# ===================================
# 출력할 HTML 문서를 생성합니다.
PRint&PrintHeader;
인쇄 "< html>< head>< title> 안녕하세요! </ /title>< /head> ";
인쇄 "< body> 안녕하세요, < i>$mFullName< /i> ! ";
"< hr> by Greeting.pl < /body>< /html>"을 인쇄합니다.
# ===================================
# 다 끝났어!
http://localhost/greeting.html을 검색하여 CGI 프로그램을 테스트합니다.
위의 Perl 프로그램에서는 CGI 프로그램으로서 require "cgi-lib.pl"을 사용하여 cgi-lib.pl 파일을 참조해야 합니다. 이 파일에는 CGI 프로그래밍을 위한 많은 기능과 절차가 있습니다. require는 C의 #include와 동일하지만 require 문 뒤에는 세미콜론이 있어야 한다는 점에 유의해야 합니다.
ReadParse 프로세스는 HTML 양식으로 제출된 데이터를 읽으며 매개변수는 배열 포인터입니다. Perl에서는 함수 및 프로시저 호출 앞에 & 기호가 와야 한다는 점에 유의해야 합니다.
mFirstName, mLastName 및 mFullName은 변수입니다. Perl에서는 변수 이름 앞에 $ 기호가 와야 합니다.
PrintHeader 함수의 실제 반환 값은 "Content-type: text/html"이며, 이는 다음 데이터가 HTML 문서임을 브라우저에 알려줍니다.
HTML 문서를 생성하는 것은 매우 간단합니다. HTML 문서의 내용을 출력하려면 print 문을 사용하면 됩니다. Perl을 사용하여 CGI 프로그램을 작성할 수 있습니까?
다음으로, 동일한 기능을 수행하는 Delphi 프로그램을 작성해 보겠습니다.
먼저 Delphi에서 모든 프로젝트를 닫고 파일/새로 만들기 메뉴를 선택하고 대화 상자에서 웹 서버 애플리케이션 유형을 선택한 다음 CGI 독립 실행형 실행 가능 옵션을 사용하면 기본 창 이름이 WebModule1인 새 프로젝트가 나타납니다.
WebModule1의 Actions 속성을 마우스로 더블클릭하면 Actions 속성 편집창이 나타납니다. 창에서 WebActionItem1이라는 새 작업을 만들고 해당 Default 속성을 True로 설정한 다음 해당 이벤트에서 OnAction 이벤트를 두 번 클릭하고 다음 코드를 추가합니다.
절차 TWebModule1.WebModule1WebActionItem1Action(Sender: TObject;요청: TWebRequest; 응답: TWebResponse; var Handled: Boolean);
var
mFirstName, mLastName, mFullName: 문자열;
HtmlDoc: 문자열;
시작하다
// 입력 값 가져오기:
mFirstName := Request.ContentFields.Values['firstname'];
mLastName := Request.ContentFields.Values['lastname'];
// 여기서 몇 가지 작업을 수행합니다.
mFullName := mFirstName + ' ' + mLastName;
// 출력할 HTML 문서를 생성합니다.
HtmlDoc := '< html>< head>< title> 안녕하세요 </ /title>< /head>';
HtmlDoc := HtmlDoc + '< body> 안녕하세요, < i>' + mFullName + '< /i> !';
HtmlDoc := HtmlDoc + '< hr> by Greeting.cgi < /body>< /html>';
응답.컨텐트 := HtmlDoc;
끝;
이 프로젝트의 유닛을 cgimain.pas로, 프로젝트를 Greeting.dpr로 저장합니다. 컴파일한 후(Ctrl+F9 사용) Greeting.exe를 OmniHTTPD의 cgi-bin 디렉터리에 복사하고 Greeting.cgi로 이름을 바꿉니다. 동시에 앞서 작성한 Greeting.html을 다음과 같이 수정합니다.
< form action="/cgi-bin/greeting.pl" method=POST>를 다음으로 변경합니다.
< 형식 action="/cgi-bin/greeting.cgi" 메서드=POST>
이러한 방식으로 http://localhost/greeting.html을 탐색하여 Delphi로 작성된 CGI 프로그램을 테스트할 수 있습니다.
이 프로그램에서 볼 수 있듯이 Delphi에서는 CGI 프로그램이 요청을 받자마자 WebActionItem의 OnAction 이벤트가 발생합니다. 이 경우 데이터 입력 및 HTML 문서 생성은 다음과 같이 수행됩니다.
Request.ContentFields.Values[HTML 양식 요소 이름]을 통해 양식 요소의 값을 가져옵니다.
Response.Content에 값을 할당하여 HTML 문서를 생성합니다.
다음은 델파이 프로그램의 세 파일의 내용입니다. ----------------------- ---- ------
인사말.dpr :
프로그램 인사말;
{$APPTYPE 콘솔}
용도
HTTP앱,
CGI앱,
'cgimain.pas' {WebModule1: TWebModule}의 cgimain;
{$Ecgi}
{$R *.RES}
시작하다
응용 프로그램.초기화;
Application.CreateForm(TWebModule1, WebModule1);
응용 프로그램.실행;
끝.
------------------------------------- ----------
cgimain.pas:
단위 cgimain;
인터페이스
Windows, 메시지, SysUtils, 클래스, HTTPApp을 사용합니다.
유형
TWebModule1 = 클래스(TWebModule)
절차 WebModule1WebActionItem1Action(Sender: TObject;요청: TWebRequest; 응답: TWebResponse; var Handled: Boolean);
사적인
{비공개 선언}
공공의
{공개 선언}
끝;
var
웹모듈1: TWeb모듈1;
구현
{$R *.DFM}
절차 TWebModule1.WebModule1WebActionItem1Action(Sender: TObject; 요청: TWebRequest; 응답: TWebResponse; var Handled: Boolean);
var
mFirstName, mLastName, mFullName: 문자열;
HtmlDoc: 문자열;
시작하다
// 입력 값 가져오기:
mFirstName := Request.ContentFields.Values['firstname'];
mLastName := Request.ContentFields.Values['lastname'];
// 여기서 몇 가지 작업을 수행합니다.
mFullName := mFirstName + ' ' + mLastName;
// 출력할 HTML 문서를 생성합니다.
HtmlDoc := '< html>< head>< title> 안녕하세요 </ /title>< /head>';
HtmlDoc := HtmlDoc + '< body> 안녕하세요, < i>' + mFullName + '< /i> !';
HtmlDoc := HtmlDoc + '< hr> by Greeting.cgi < /body>< /html>';
응답.컨텐트 := HtmlDoc;
끝;
끝.
------------------------------------- ----------
cgimain.dfm:
개체 WebModule1: TWebModule1
OldCreateOrder = 거짓
작업 = <
목
기본값=참
이름 = 'WebActionItem1'
OnAction = WebModule1WebActionItem1Action
끝>
왼쪽 = 192
최고 = 107
높이 = 150
너비 = 215
끝