จากการบรรยายครั้งนี้เราจะเข้าสู่กระบวนการเรียนรู้การเขียนโปรแกรม CGI จากการบรรยายครั้งก่อน คุณได้เข้าใจความรู้พื้นฐานของการเขียนโปรแกรม CGI แล้ว ตอนนี้คุณสามารถนั่งเขียนโปรแกรม CGI ของคุณได้แล้ว!
3. การเขียนโปรแกรม CGI
1. เอกสารแนบฝั่งเซิร์ฟเวอร์ (SSI) และเกตเวย์
2. เกตเวย์: เชื่อมต่อโปรโตคอลอื่น ๆ ผ่านทางเว็บ
ในกระบวนการเขียนโปรแกรม CGI ควรปฏิบัติตามจุดออกแบบแอปพลิเคชันต่อไปนี้:
(1) ถามคำถาม - ปัญหาที่คุณต้องการแก้ไข
(2) ขั้นตอนการออกแบบ - กำหนดกรอบการทำงานพื้นฐานและฟังก์ชันของโปรแกรม CGI
(3) ขั้นตอนการเขียนโค้ด - การตระหนักถึงแนวคิดด้วยการลงมือปฏิบัติ
(4) การปลูกถ่ายโปรแกรม - เขียนโค้ดแบบพกพา
(5) มุ่งมั่นสู่ความเป็นเลิศ - ยกระดับโปรแกรมไปสู่ระดับที่สูงขึ้น
1. เอกสารแนบฝั่งเซิร์ฟเวอร์ (SSI) และเกตเวย์
ในส่วนนี้ เราจะแนะนำเอกสารแนบฝั่งเซิร์ฟเวอร์ SSI (รวมฝั่งเซิร์ฟเวอร์) และเกตเวย์ พูดอย่างเคร่งครัด SSI ไม่ได้เป็นส่วนหนึ่งของการเขียนโปรแกรม CGI แต่ SSI สามารถทำงานบางอย่างให้สำเร็จได้เหมือนกับที่โปรแกรม CGI ทั่วไปสามารถทำได้ และบางครั้ง SSI ก็เป็นตัวเลือกที่ดีที่สุดด้วยซ้ำ ดังนั้นจึงมีการแนะนำโดยย่อไว้ที่นี่
SSI กำหนดชุดคำสั่งที่ฝังอยู่ในข้อความ HTML ก่อนที่ข้อความ HTML จะถูกส่งไปยังไคลเอนต์ HTTP เว็บเซิร์ฟเวอร์จะประมวลผลคำสั่ง SSI เหล่านี้ล่วงหน้าและส่งออกข้อความ HTML ที่ประมวลผลไปยังเบราว์เซอร์ของไคลเอนต์ HTTP
รูปแบบคำสั่งของ SSI คือ:
< !--# พารามิเตอร์คำสั่ง = "ค่า" -->
คำสั่ง SSI แตกต่างจากจาวาหรือจาวาสคริปต์ตรงที่จะถูกประมวลผลบนฝั่งเซิร์ฟเวอร์มากกว่าในฝั่งไคลเอ็นต์ ซึ่งคล้ายกับโปรแกรม CGI แน่นอนว่า ภายในขอบเขตการทำงานของ SSI นั้น มีข้อดีเหมือนกับโปรแกรม CGI ซึ่งสามารถปรับปรุงการใช้ทรัพยากรของเซิร์ฟเวอร์ได้ และเว็บเบราว์เซอร์ใดๆ บนไคลเอนต์ก็สามารถเรียกดูข้อความ HTML ที่มี SSI ได้
ต่อไปนี้คือคำสั่ง SSI ที่ใช้กันทั่วไปหกคำสั่ง:
(1) รวมคำสั่ง
(2) คำสั่งเอคโค่
(3) คำสั่งดำเนินการ
(4) คำสั่งกำหนดค่า
(5) คำสั่ง fsize
(6) คำสั่งแฟลชโมด
รวมคำสั่ง
พารามิเตอร์ที่รองรับเพียงอย่างเดียวคือ file ซึ่งจะแทรกเนื้อหาของไฟล์ที่ระบุโดยพารามิเตอร์ file ลงในข้อความ HTML ปัจจุบัน ถ้าคุณรู้ภาษา C จะเห็นว่ามันมีฟังก์ชันเหมือนกับคำสั่ง #include ในภาษา C ตัวอย่างเช่น มีข้อความ HTML สองรายการ: main.html และ header.html ใช้คำสั่ง include ใน main.html: main.html:
<html>
< Tilte> ทดสอบรวมคำสั่ง SSI </ /title>
< !--#include file="header.html" -->
<ร่างกาย>
ส่วนหัวด้านบนมาจาก header.html!
</ /ร่างกาย>
</ /html>
header.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 ต้องจัดเก็บไว้ในไดเร็กทอรี HtDocs ของ OmniHTTPD และเข้าถึงได้ในเบราว์เซอร์โดยใช้ที่อยู่ http://localhost/main.shtml)
คำสั่งผู้บริหาร
พารามิเตอร์ทั้งสองคือ cgi และ cmd แบบแรกเรียกไฟล์ปฏิบัติการ เช่น cgi="/cgi-bin/finger.cgi"; แบบหลังเรียกคำสั่งระบบ เช่น cmd="ls" ขออภัย OmniHTTPD ไม่รองรับคำสั่ง SSI นี้ (อาจเป็นเวอร์ชันล่าสุดในขณะนี้)
คำสั่งกำหนดค่า
คำสั่งนี้กำหนดวิธีที่เซิร์ฟเวอร์จัดการไฟล์และแสดงวันที่ มันมีสองพารามิเตอร์:
(1) timefmt กำหนดรูปแบบการแสดงวันที่ ใช้ man strftime บน UNIX เพื่อสืบค้นค่าที่มีอยู่
(2) sizefmt กำหนดรูปแบบในการแสดงความยาวของไฟล์ ค่าเป็นไบต์หรือ addrev คำสั่งนี้ยังไม่ได้รับการสนับสนุนใน OmniHTTPD
คำสั่ง fsize
คำสั่งนี้แสดงขนาดของไฟล์ที่กำหนด พารามิเตอร์คือไฟล์ ระบุพาธและชื่อไฟล์ของไฟล์
คำสั่ง flash mod
คำสั่งนี้แสดงวันที่แก้ไขล่าสุดของไฟล์ที่ระบุ พารามิเตอร์คือไฟล์ ระบุพาธและชื่อไฟล์ของไฟล์
2. เกตเวย์: เชื่อมต่อโปรโตคอลอื่น ๆ ผ่านทางเว็บ
โปรโตคอล HTTP ไม่สามารถเข้าถึงทรัพยากรทั้งหมดบนอินเทอร์เน็ต เมื่อคุณต้องการเข้าถึงทรัพยากรอื่นที่ไม่ใช่โปรโตคอล HTTP (เช่น POP3 และ SMTP เพื่อส่งและรับอีเมล) คุณต้องมีเกตเวย์ โปรแกรม CGI เป็นวิธีที่ดีในการปรับใช้เกตเวย์
เกตเวย์ที่ใช้กันทั่วไปบางตัวมีให้ในเซิร์ฟเวอร์ UNIX HTTP จำนวนมาก เช่น finger, wais, archie เป็นต้น แต่ใน OmniHTTPD เกตเวย์เหล่านี้ไม่ได้ระบุไว้ แต่เราสามารถเพิ่มฟังก์ชันเกตเวย์ให้กับ OmniHTTPD ได้โดยการเขียนโปรแกรม CGI
แบบฟอร์มและการประมวลผล
แบบฟอร์ม HTML เป็นส่วนหนึ่งของเอกสาร WEB และใช้เพื่อส่งข้อมูลที่ผู้ใช้กรอกไปยังเซิร์ฟเวอร์ โดยปกติแล้ว ข้อมูลนี้จะถูกส่งไปยังโปรแกรม CGI ซึ่งดำเนินการชุดของการดำเนินการหรือการประมวลผลข้อมูลตามข้อมูลอินพุต จากนั้นจะสร้างเอกสาร HTML ที่แสดงถึงผลการประมวลผล และส่งกลับไปยังเบราว์เซอร์ของลูกค้า
จะเห็นได้ว่าส่วนสำคัญของโปรแกรม CGI คือการได้รับข้อมูลอินพุตและสร้างเอกสาร HTML ในขณะที่ส่วนการดำเนินการและการประมวลผลข้อมูลจะเหมือนกับแอปพลิเคชันส่วนใหญ่ ในการบรรยายนี้ ผมจะแนะนำวิธีรับข้อมูลและส่งออกเอกสาร HTML ใน Perl และ Delphi
ขั้นแรก เราสร้างเอกสาร HTML ชื่อ Greeting.html:
ไฟล์ Greeting.html (เก็บไว้ในไดเร็กทอรี HtDocs ของ OmniHTTPD)
<html>
<หัว>
<title>นี่คือหน้าทักทาย! </title>
< h1> คำทักทาย </ /h1>
<ร่างกาย>
<ชม.>
< การกระทำแบบฟอร์ม = "/cgi-bin/greeting.pl" method=POST>
< p> ชื่อของคุณ: < input type=text name="firstname" size=60 maxlength=80> < /p>
< p> นามสกุลของคุณ: < input type=text name="lastname" size=60 maxlength=80> < /p>
<ชม.>
< p> < ประเภทอินพุต = ค่าส่ง = "ตกลงทั้งหมด!"> < ประเภทอินพุต = ค่ารีเซ็ต = "ล้างทั้งหมด"> </ /p>
</ /แบบฟอร์ม>
</ /ร่างกาย>
</ /html>
นี่คือโปรแกรม Perl CGI Greeting.pl:
ไฟล์ Greeting.pl (เก็บไว้ในไดเร็กทอรี cgi-bin ของ OmniHTTPD) # สวัสดีคุณ!
ต้องการ "cgi-lib.pl";
-
#รับค่าเข้า
&ReadParse(*อินพุต);
$mFirstName = $input{'firstname'};
$mLastName = $input{'lastname'};
-
#ดำเนินการบางอย่างที่นี่
$mFullName = "$mFirstName $mLastName";
-
# สร้างเอกสาร HTML เพื่อส่งออก
PRint&PrintHeader;
พิมพ์ "< html>< head>< title> สวัสดีคุณ! </ /title>< /head> ";
พิมพ์ "< body> สวัสดี < i>$mFullName< /i> ! ";
พิมพ์ "< hr> โดย Greeting.pl < /body>< /html>";
-
#เสร็จเรียบร้อย!
ทดสอบโปรแกรม CGI โดยเปิด http://localhost/greeting.html
ในโปรแกรม Perl ข้างต้น ในฐานะโปรแกรม CGI คุณต้องใช้ need "cgi-lib.pl" เพื่ออ้างอิงไฟล์ cgi-lib.pl ไฟล์นี้มีฟังก์ชันและขั้นตอนมากมายสำหรับการเขียนโปรแกรม CGI need เทียบเท่ากับ #include ในภาษา C แต่ควรสังเกตว่าจะต้องมีเครื่องหมายอัฒภาคหลังคำสั่ง need
กระบวนการ ReadParse อ่านข้อมูลที่ส่งโดยแบบฟอร์ม HTML และพารามิเตอร์คือตัวชี้อาร์เรย์ ควรสังเกตว่าในภาษา Perl การเรียกใช้ฟังก์ชันและโพรซีเดอร์ต้องนำหน้าด้วยสัญลักษณ์ &
mFirstName, mLastName และ mFullName เป็นตัวแปร ในภาษา Perl ชื่อตัวแปรจะต้องนำหน้าด้วยเครื่องหมาย $
ค่าที่ส่งคืนที่แท้จริงของฟังก์ชัน PrintHeader คือ "Content-type: text/html" ซึ่งบอกเบราว์เซอร์ว่าข้อมูลต่อไปนี้เป็นเอกสาร HTML
การสร้างเอกสาร HTML นั้นง่ายมาก เพียงใช้คำสั่งพิมพ์เพื่อส่งออกเนื้อหาของเอกสาร HTML แล้วคุณล่ะใช้ Perl เพื่อเขียนโปรแกรม CGI ได้ไหม?
ต่อไป เรามาเขียนโปรแกรม Delphi เพื่อทำหน้าที่เดียวกันนี้ให้สำเร็จ:
ขั้นแรกให้ปิดโครงการทั้งหมดใน Delphi เลือกเมนู File/New เลือกประเภทแอปพลิเคชันเว็บเซิร์ฟเวอร์ในกล่องโต้ตอบ และใช้ตัวเลือกปฏิบัติการ CGI Stand-alone โครงการใหม่จะปรากฏขึ้นพร้อมชื่อหน้าต่างหลัก WebModule1
คลิกสองครั้งที่เมาส์บนคุณสมบัติ Actions ของ WebModule1 และหน้าต่างการแก้ไขคุณสมบัติ Actions จะปรากฏขึ้น สร้างการดำเนินการใหม่ในหน้าต่างชื่อ WebActionItem1 ตั้งค่าคุณสมบัติเริ่มต้นเป็น True และดับเบิลคลิกที่เหตุการณ์ OnAction ในเหตุการณ์ เพิ่มรหัสต่อไปนี้:
ขั้นตอน TWebModule1.WebModule1WebActionItem1Action (ผู้ส่ง: TObject; คำขอ: TWebRequest; การตอบสนอง: TWebResponse; var จัดการ: บูลีน);
var
mFirstName, mLastName, mFullName: สตริง;
HtmlDoc: สตริง;
เริ่ม
// รับค่าอินพุต:
mFirstName := Request.ContentFields.Values['ชื่อ'];
mLastName := Request.ContentFields.Values['lastname'];
// ดำเนินการบางอย่างที่นี่
mFullName := mFirstName + ' ' + mLastName;
// สร้างเอกสาร HTML เพื่อส่งออก
HtmlDoc := '< html>< head>< title> สวัสดีคุณ! </ /title>< /head>';
HtmlDoc := HtmlDoc + '< body> สวัสดี < i>' + mFullName + '< /i> !';
HtmlDoc := HtmlDoc + '< hr> โดย Greeting.cgi < /body>< /html>';
การตอบกลับเนื้อหา := HtmlDoc;
จบ;
บันทึกหน่วยของโปรเจ็กต์นี้เป็น cgimain.pas และโปรเจ็กต์เป็น Greeting.dpr หลังจากการคอมไพล์ (โดยใช้ Ctrl+F9) ให้คัดลอก Greeting.exe ไปยังไดเร็กทอรี cgi-bin ของ OmniHTTPD และเปลี่ยนชื่อเป็น Greeting.cgi ในเวลาเดียวกัน ให้ทำการแก้ไขต่อไปนี้ใน Greeting.html ที่เราเขียนไว้ก่อนหน้านี้:
เปลี่ยน < form action="/cgi-bin/greeting.pl" method=POST> เป็น
< การกระทำแบบฟอร์ม = "/cgi-bin/greeting.cgi" method=POST>
ด้วยวิธีนี้ คุณสามารถทดสอบโปรแกรม CGI ที่เขียนด้วย Delphi ได้โดยการเรียกดู http://localhost/greeting.html
ดังที่เห็นได้จากโปรแกรมนี้ ใน Delphi เหตุการณ์ OnAction ของ WebActionItem จะเกิดขึ้นทันทีที่โปรแกรม CGI ได้รับคำขอ ในเหตุการณ์นี้ การป้อนข้อมูลและการสร้างเอกสาร HTML จะดำเนินการดังนี้:
รับค่าขององค์ประกอบแบบฟอร์มผ่าน Request.ContentFields.Values[ชื่อองค์ประกอบแบบฟอร์ม HTML]
สร้างเอกสาร HTML โดยการกำหนดค่าให้กับ Response.Content
ต่อไปนี้เป็นเนื้อหาของไฟล์ทั้งสามไฟล์ของโปรแกรม Delphi: ------------------------------------ ---- -------------------
ทักทาย.dpr :
โปรแกรมทักทาย;
{$ประเภทแอปคอนโซล}
การใช้งาน
HTTPApp,
ซีจีไอแอป,
cgimain ใน 'cgimain.pas' {WebModule1: TWebModule};
{$อีซีจีไอ}
{$อาร์ *.เรส}
เริ่ม
แอปพลิเคชันเริ่มต้น;
แอปพลิเคชัน CreateForm (TWebModule1, WebModule1);
แอปพลิเคชันเรียกใช้;
จบ.
-------------------------------------------------- -------------------------------------------------- ----------
cgimain.pas:
หน่วย cgimain;
อินเตอร์เฟซ
ใช้ Windows, ข้อความ, SysUtils, คลาส, HTTPApp;
พิมพ์
TWebModule1 = คลาส (TWebModule)
ขั้นตอน WebModule1WebActionItem1Action (ผู้ส่ง: TObject; คำขอ: TWebRequest; การตอบสนอง: TWebResponse; var จัดการ: บูลีน);
ส่วนตัว
{ประกาศส่วนตัว}
สาธารณะ
{ประกาศสาธารณะ}
จบ;
var
เว็บโมดูล1: TWebModule1;
การดำเนินการ
{$R *.DFM}
ขั้นตอน TWebModule1.WebModule1WebActionItem1Action (ผู้ส่ง: TObject; คำขอ: TWebRequest; การตอบสนอง: TWebResponse; var จัดการ: บูลีน);
var
mFirstName, mLastName, mFullName: สตริง;
HtmlDoc: สตริง;
เริ่ม
// รับค่าอินพุต:
mFirstName := Request.ContentFields.Values['ชื่อ'];
mLastName := Request.ContentFields.Values['lastname'];
// ดำเนินการบางอย่างที่นี่
mFullName := mFirstName + ' ' + mLastName;
// สร้างเอกสาร HTML เพื่อส่งออก
HtmlDoc := '< html>< head>< title> สวัสดีคุณ! </ /title>< /head>';
HtmlDoc := HtmlDoc + '< body> สวัสดี < i>' + mFullName + '< /i> !';
HtmlDoc := HtmlDoc + '< hr> โดย Greeting.cgi < /body>< /html>';
การตอบกลับเนื้อหา := HtmlDoc;
จบ;
จบ.
-------------------------------------------------- -------------------------------------------------- ----------
cgimain.dfm:
วัตถุ WebModule1: TWebModule1
OldCreateOrder = เท็จ
การกระทำ = <
รายการ
ค่าเริ่มต้น=จริง
ชื่อ = 'WebActionItem1'
OnAction = WebModule1WebActionItem1Action
สิ้นสุด>
ซ้าย = 192
บน = 107
ส่วนสูง = 150
ความกว้าง = 215
จบ