ในการบรรยายครั้งก่อน เราได้แนะนำฟังก์ชันของโปรแกรม CGI วันนี้เราจะเข้าสู่: ตอนที่ 2 แนวคิดการเขียนโปรแกรม CGI เนื้อหาการบรรยายนี้เป็นพื้นฐานสำหรับความเข้าใจเชิงลึกเกี่ยวกับโปรแกรม CGI
การบรรยายชุดนี้ใช้ Delphi ในการเขียนโปรแกรม CGI สำหรับเนื้อหานี้ Delphi ถูกรวมไว้ในชั้นเรียน คุณอาจคิดว่าการบรรยายนี้ไม่จำเป็น แต่ผมคิดว่าข้อดีอย่างหนึ่งของ CGI ก็คือ มีภาษาสำหรับการพัฒนามากมาย (จะกล่าวถึงฉบับนี้ด้านล่าง) และเนื้อหาของการบรรยายนี้สามารถนำไปใช้ในภาษาการเขียนโปรแกรมใดก็ได้ (รวมถึง Delphi) ดังนั้น เพื่อใช้ประโยชน์จาก CGI เนื้อหาของการบรรยายนี้จึงยังมีความจำเป็น นอกจากนี้ เนื้อหาของการบรรยายนี้ยังเป็นพื้นฐานสำหรับความเข้าใจเชิงลึกของโปรแกรม CGI
2. ข้อกำหนด CGI:
โดยทั่วไปแล้ว เว็บเซิร์ฟเวอร์เป็นคอมพิวเตอร์ที่ทรงพลัง แต่ก็เป็นไปไม่ได้ที่จะใช้พลังการประมวลผลทั้งหมด การเกิดขึ้นของ CGI ช่วยให้ผู้ใช้สามารถใช้พลังการประมวลผลของเว็บเซิร์ฟเวอร์เพื่อมอบเนื้อหาที่น่าสนใจและไดนามิกให้กับลูกค้าระยะไกล ข้อกำหนด CGI ใช้กับเซิร์ฟเวอร์เว็บและแอปพลิเคชันที่ทำงานบนเว็บ ไม่ได้เป็นส่วนหนึ่งของโปรโตคอล HTTP แต่เซิร์ฟเวอร์เว็บส่วนใหญ่สนับสนุนข้อกำหนดนี้ เช่น NCSA httpd, CERN httpd, Apache httpd, IIS และ OmniHTTPD ที่เราใช้
2.1 ภาพรวม CGI
CGI กำหนดชุดของกฎที่ปฏิบัติตามในการทำงานร่วมกันระหว่างเว็บเซิร์ฟเวอร์ เบราว์เซอร์ และแอปพลิเคชัน ตัวอย่างเช่น สืบค้นระบบฐานข้อมูลระยะไกลผ่านเว็บเบราว์เซอร์:
2.2. ภาษา:
โปรแกรม CGI สามารถเขียนในภาษาใดก็ได้ที่สามารถดำเนินการบนเว็บเซิร์ฟเวอร์ได้ คุณควรเลือกภาษาที่คุณคุ้นเคยและเหมาะสมกับงานปัจจุบันของคุณมากที่สุด ตัวอย่างเช่น ภาษา Perl เหมาะสำหรับการประมวลผลสตริงและไฟล์ C เหมาะสำหรับโปรแกรมขนาดใหญ่และซับซ้อน Visual Basic และ Delphi เหมาะสำหรับการประมวลผลฐานข้อมูล และอื่นๆ ภาษาต่อไปนี้เป็นภาษาโปรแกรม CGI ที่ใช้กันทั่วไป:
ค
ซี++
ภาษาเพิร์ล
ทีซีแอล
หลาม
เชลล์สคริปท์
วิชวลเบสิก
เดลฟี
แอปเปิลสคริปต์
2.3 วิธี CGI:
วิธีการเรียก CGI เรียกว่าวิธี CGI มีสามวิธีหลัก CGI:
2.3.1 วิธีการรับ:
วิธีการ GET เป็นวิธีการที่เบราว์เซอร์ใช้เพื่อส่งคำขอไปยังเซิร์ฟเวอร์เว็บ เมื่อใช้วิธีการนี้ โปรแกรม CGI จะรับข้อมูลจากตัวแปรสภาพแวดล้อม QUERY_STRING เพื่อให้ได้พารามิเตอร์อินพุต โปรแกรม CGI จะต้องวิเคราะห์ตัวแปรสภาพแวดล้อมนี้ เมื่อข้อมูลที่จะส่งยาวมากควรใช้วิธี POST
2.3.2 วิธีการโพสต์:
เมื่อใช้วิธีการ POST โปรแกรม CGI จะได้รับข้อมูลอินพุตจาก stdin (อินพุตมาตรฐาน) เนื่องจากไม่มี EOF (สิ้นสุดไฟล์) ที่ส่วนท้ายของข้อมูลอินพุต โปรแกรม CGI จึงต้องใช้ค่า CONTENT_LENGTH ของตัวแปรสภาพแวดล้อมเพื่อให้สามารถอ่านข้อมูลอินพุตได้อย่างถูกต้อง ข้อได้เปรียบที่ใหญ่ที่สุดของการใช้วิธีการนี้คือสามารถส่งข้อมูลจำนวนมากได้ ในขณะที่วิธี GET ไม่สามารถส่งข้อมูลจำนวนมากได้เนื่องจากการจำกัดความยาวของ URL (โดยทั่วไปจะไม่เกิน 1,024 ไบต์) ในขณะนี้ วิธี POST เป็นเพียงตัวเลือกเดียว
2.3.3 วิธี HEAD:
โดยพื้นฐานแล้วเมธอด HEAD นั้นเหมือนกับเมธอด GET ยกเว้นว่าจะส่งข้อมูลจากเซิร์ฟเวอร์เว็บไปยังเบราว์เซอร์ ยิ่งไปกว่านั้น เฉพาะข้อมูลส่วนหัว HTTP เท่านั้นที่จะถูกส่ง
2.4 ข้อมูลจำเพาะของอินเทอร์เฟซ:
ต่อไปนี้จะแนะนำวิธีการหลักสี่วิธีสำหรับเว็บเซิร์ฟเวอร์ในการสื่อสารกับโปรแกรม CGI: ตัวแปรสภาพแวดล้อม บรรทัดคำสั่ง อินพุตมาตรฐาน และเอาต์พุตมาตรฐาน (อิงตาม CGI เวอร์ชัน 1.1)
2.4.1. ตัวแปรสภาพแวดล้อม:
AUTH_TYPE: หากเซิร์ฟเวอร์รองรับการตอบรับและสคริปต์ได้รับการป้องกัน ให้ระบุประเภทของการตอบรับ
CONTENT_LENGTH: ให้ความยาวของข้อมูลที่ส่งโดยใช้วิธี POST เป็นไบต์ ตัวแปรว่างเปล่าเมื่อใช้เมธอด GET
CONTENT_TYPE: ให้ข้อมูลประเภท MINE ที่ส่งเมื่อใช้วิธีการ POST ตัวแปรว่างเปล่าเมื่อใช้เมธอด GET เช่น: application/x-www-form-urlencoded.
GETWAY_INTERFACE: ระบุชื่อข้อกำหนด CGI และหมายเลขเวอร์ชัน เช่น CGI/1.1
PATH_INFO: ให้ข้อมูลเส้นทางเพิ่มเติมหลังชื่อโปรแกรม CGI ใน URL
PATH_TRANSLATED: เส้นทางทางกายภาพของโปรแกรม CGI ซึ่งมักจะเป็นไดเรกทอรีรากของเว็บ ชื่อสคริปต์ และข้อมูลเส้นทางเพิ่มเติม
QUERY_STRING: ข้อมูลที่อยู่หลังอักขระ "?" ใน URL ตัวแปรสภาพแวดล้อมนี้ให้ข้อมูลอินพุตเมื่อใช้เมธอด GET
REMOTE_ADDR: IP ของคอมพิวเตอร์ระยะไกลที่ทำการร้องขอ
REMOTE_HOST: ชื่อของคอมพิวเตอร์ระยะไกลที่ทำการร้องขอ
REMOTE_IDENT: ให้ชื่อผู้ใช้ที่กำหนดใน RFC 931
หมายเหตุ: RFC 931 เป็นเอกสารที่เชื่อถือได้ของอินเทอร์เน็ต ซึ่งอธิบายวิธีการยืนยันการระบุตัวตนของผู้ใช้ในการเชื่อมต่อ TCP เอกสารประกอบอยู่ที่: http://sunsite.auc.dk/RFC/rfc/rfc931.html
REMOTE_USER: ให้ชื่อผู้ใช้ที่ได้รับอนุญาตของลูกค้าที่ทำการร้องขอ
REQUEST_METHOD: วิธีการส่งคำขอซึ่งอาจเป็น GET, HEAD และ POST
SCRIPT_NAME: เส้นทางเสมือนเพื่อรันโปรแกรม CGI เช่น: /cgi-bin/query.cgi
SERVER_NAME: ชื่อโดเมนหรือที่อยู่ IP ของคอมพิวเตอร์ที่ใช้งานซอฟต์แวร์เซิร์ฟเวอร์เว็บ เช่น: www.chinabyte.com
SERVER_PORT: หมายเลขพอร์ตของเว็บเซิร์ฟเวอร์ ค่าเริ่มต้นคือ 80
SERVER_PROTOCOL: ชื่อโปรโตคอลและหมายเลขเวอร์ชันที่ใช้โดยเว็บเซิร์ฟเวอร์ เช่น: HTTPD/1.0
SERVER_SOFTWARE: ชื่อของเว็บเซิร์ฟเวอร์ที่รันโปรแกรม CGI รูปแบบคือ "ชื่อเซิร์ฟเวอร์/หมายเลขเวอร์ชัน" เช่น: NCSA/1.5b5
HTTP_ACCEPT: "Acccpect: header line" ส่งโดยไคลเอนต์ ซึ่งสอดคล้องกับประเภท MIME ที่ไคลเอนต์สามารถจัดการได้ ในรูปแบบของ "type/subtype, type/subtype, ฯลฯ" เช่น: */*, image/ gif, รูปภาพ/jpeg
HTTP_REFERER: ใช่ ผู้อ้างอิง: ไดเรกทอรีของบรรทัดส่วนหัวที่มี URL ของแบบฟอร์ม (แบบฟอร์ม) เมื่อทำการร้องขอ CGI เช่น: http://www.chinabyte.com/register.form
HTTP_USER_AGENT: ชื่อของเบราว์เซอร์ไคลเอ็นต์ที่ส่งคำขอ เช่น Mozilla/1.2N (Windows;I;32bit)
คุณสามารถดูตัวแปรสภาพแวดล้อมข้างต้นได้โดยใช้โปรแกรมสาธิตในการบรรยายครั้งก่อน
2.4.2 บรรทัดคำสั่ง:
บรรทัดคำสั่ง CGI จะใช้เมื่อทำการสืบค้นด้วย ISINDEX เท่านั้น แบบสอบถาม ISINDEX เป็นแบบสอบถามพิเศษที่อยู่ระหว่าง <ISINDEX> และ <BASE HREP=".."> บรรทัดคำสั่งสามารถรับได้หลายพารามิเตอร์
2.4.3. อินพุตมาตรฐาน:
เมื่อใช้วิธีการ POST โปรแกรม CGI จะรับข้อมูลที่ส่งจาก stdin ตามที่กล่าวไว้ก่อนหน้านี้ ต้องใช้ค่าตัวแปรสภาพแวดล้อม CONTENT_TYPE และ CONTENT_LENGTH สิ่งที่ควรสังเกตคือ URL ในข้อมูลถูกเข้ารหัส เช่น ช่องว่างจะถูกแทนที่ด้วยเครื่องหมายบวก ~ ถูกแทนที่ด้วย %7E เป็นต้น
2.4.4. เอาต์พุตมาตรฐาน:
โปรแกรม CGI ส่งข้อมูลไปยังเบราว์เซอร์ผ่านเอาต์พุตมาตรฐาน หรือคำสั่งที่เว็บเซิร์ฟเวอร์สามารถตีความได้ โปรแกรม CGI สามารถสื่อสารกับเบราว์เซอร์ผ่านเว็บเซิร์ฟเวอร์ และชื่อโปรแกรมต้องขึ้นต้นด้วย "nph-" ซึ่งแสดงถึงข้อมูลส่วนหัวที่ไม่ได้วิเคราะห์ โปรแกรม CGI มีหน้าที่รับผิดชอบในความถูกต้องของข้อมูลส่วนหัว HTTP ที่ส่งคืนไปยังเบราว์เซอร์
เมื่อไม่ได้ใช้โปรแกรม nph เซิร์ฟเวอร์จะค้นหาส่วนหัวพิเศษสามส่วนหัวที่ CGI อาจส่งคืน:
Content-type: ข้อมูลส่วนหัวประเภท MIME เช่น: เมื่อป้อน HTML โดยทั่วไปจะใช้ "Content-type:text/html"
ตำแหน่ง: บอกเซิร์ฟเวอร์ว่าคุณกำลังชี้ไปที่เอกสารอื่น เซิร์ฟเวอร์เปลี่ยนเส้นทางไคลเอ็นต์หรือส่งเนื้อหาเอกสาร ขึ้นอยู่กับว่า URL นั้นเป็นเส้นทางแบบเต็มหรือเส้นทางสัมพัทธ์
สถานะ: บรรทัดสถานะที่เซิร์ฟเวอร์ส่งไปยังไคลเอนต์ รูปแบบคือ: nnnXXXXX, nnn เป็นรหัสสามหลัก และ XXXXX เป็นข้อความคำอธิบายที่เกี่ยวข้อง