การเขียนโปรแกรมเว็บ C ++

CGI คืออะไร?

  • Common Gateway Interface หรือ CGI เป็นชุดของมาตรฐานที่กำหนดวิธีการแลกเปลี่ยนข้อมูลระหว่างเว็บเซิร์ฟเวอร์และสคริปต์ที่กำหนดเอง

  • ปัจจุบันข้อกำหนด CGI ได้รับการดูแลโดย NCSA และ NCSA กำหนด CGI ดังนี้ -

  • Common Gateway Interface หรือ CGI เป็นมาตรฐานสำหรับโปรแกรมเกตเวย์ภายนอกเพื่อเชื่อมต่อกับเซิร์ฟเวอร์ข้อมูลเช่นเซิร์ฟเวอร์ HTTP

  • เวอร์ชันปัจจุบันคือ CGI / 1.1 และ CGI / 1.2 อยู่ระหว่างการดำเนินการ

การท่องเว็บ

เพื่อทำความเข้าใจแนวคิดของ CGI มาดูกันว่าจะเกิดอะไรขึ้นเมื่อเราคลิกไฮเปอร์ลิงก์เพื่อเรียกดูหน้าเว็บหรือ URL

  • เบราว์เซอร์ของคุณติดต่อกับเว็บเซิร์ฟเวอร์ HTTP และต้องการ URL เช่น ชื่อไฟล์.

  • เว็บเซิร์ฟเวอร์จะแยกวิเคราะห์ URL และจะค้นหาชื่อไฟล์ หากพบไฟล์ที่ร้องขอเว็บเซิร์ฟเวอร์จะส่งไฟล์นั้นกลับไปที่เบราว์เซอร์มิฉะนั้นจะส่งข้อความแสดงข้อผิดพลาดที่ระบุว่าคุณร้องขอไฟล์ผิด

  • เว็บเบราว์เซอร์รับการตอบสนองจากเว็บเซิร์ฟเวอร์และแสดงไฟล์ที่ได้รับหรือข้อความแสดงข้อผิดพลาดตามการตอบกลับที่ได้รับ

อย่างไรก็ตามเป็นไปได้ที่จะตั้งค่าเซิร์ฟเวอร์ HTTP ในลักษณะที่เมื่อใดก็ตามที่มีการร้องขอไฟล์ในไดเร็กทอรีหนึ่งไฟล์นั้นจะไม่ถูกส่งกลับ แทนที่จะดำเนินการเป็นโปรแกรมและผลลัพธ์ที่ได้จากโปรแกรมจะถูกส่งกลับไปยังเบราว์เซอร์ของคุณเพื่อแสดง

Common Gateway Interface (CGI) เป็นโปรโตคอลมาตรฐานสำหรับการเปิดใช้งานแอปพลิเคชัน (เรียกว่าโปรแกรม CGI หรือสคริปต์ CGI) เพื่อโต้ตอบกับเว็บเซิร์ฟเวอร์และกับไคลเอนต์ โปรแกรม CGI เหล่านี้สามารถเขียนด้วย Python, PERL, Shell, C หรือ C ++ เป็นต้น

แผนภาพสถาปัตยกรรม CGI

โปรแกรมง่ายๆต่อไปนี้แสดงสถาปัตยกรรมอย่างง่ายของ CGI -

การกำหนดค่าเว็บเซิร์ฟเวอร์

ก่อนที่คุณจะดำเนินการเขียนโปรแกรม CGI ตรวจสอบให้แน่ใจว่าเว็บเซิร์ฟเวอร์ของคุณรองรับ CGI และได้รับการกำหนดค่าให้จัดการโปรแกรม CGI โปรแกรม CGI ทั้งหมดที่จะเรียกใช้โดยเซิร์ฟเวอร์ HTTP จะถูกเก็บไว้ในไดเร็กทอรีที่กำหนดค่าไว้ล่วงหน้า ไดเร็กทอรีนี้เรียกว่าไดเร็กทอรี CGI และตามแบบแผนจะถูกตั้งชื่อเป็น / var / www / cgi-bin ตามแบบแผนไฟล์ CGI จะมีนามสกุลเป็น.cgiแม้ว่าจะเป็นไฟล์ปฏิบัติการ C ++

ตามค่าเริ่มต้น Apache Web Server ถูกกำหนดค่าให้รันโปรแกรม CGI ใน / var / www / cgi-bin หากคุณต้องการระบุไดเร็กทอรีอื่นเพื่อรันสคริปต์ CGI ของคุณคุณสามารถแก้ไขส่วนต่อไปนี้ในไฟล์ httpd.conf -

<Directory "/var/www/cgi-bin">
   AllowOverride None
   Options ExecCGI
   Order allow,deny
   Allow from all
</Directory>
 
<Directory "/var/www/cgi-bin">
   Options All
</Directory>

ที่นี่ฉันถือว่าคุณมี Web Server และทำงานได้สำเร็จและคุณสามารถรันโปรแกรม CGI อื่น ๆ เช่น Perl หรือ Shell เป็นต้น

โปรแกรม CGI ครั้งแรก

พิจารณาเนื้อหาโปรแกรม C ++ ต่อไปนี้ -

#include <iostream>
using namespace std;

int main () {
   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>Hello World - First CGI Program</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";
   cout << "<h2>Hello World! This is my first CGI program</h2>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

รวบรวมโค้ดด้านบนและตั้งชื่อไฟล์ปฏิบัติการเป็น cplusplus.cgi ไฟล์นี้ถูกเก็บไว้ในไดเร็กทอรี / var / www / cgi-bin และมีเนื้อหาดังต่อไปนี้ ก่อนที่จะรันโปรแกรม CGI ของคุณตรวจสอบให้แน่ใจว่าคุณได้เปลี่ยนโหมดของไฟล์โดยใช้ไฟล์chmod 755 cplusplus.cgi คำสั่ง UNIX เพื่อทำให้ไฟล์เรียกทำงานได้

โปรแกรม CGI แรกของฉัน

โปรแกรม C ++ ข้างต้นเป็นโปรแกรมง่ายๆที่เขียนผลลัพธ์บนหน้าจอไฟล์ STDOUT เช่น มีคุณสมบัติที่สำคัญและพิเศษอย่างหนึ่งซึ่งก็คือการพิมพ์บรรทัดแรกContent-type:text/html\r\n\r\n. บรรทัดนี้จะถูกส่งกลับไปยังเบราว์เซอร์และระบุประเภทเนื้อหาที่จะแสดงบนหน้าจอเบราว์เซอร์ ตอนนี้คุณต้องเข้าใจแนวคิดพื้นฐานของ CGI แล้วและคุณสามารถเขียนโปรแกรม CGI ที่ซับซ้อนได้โดยใช้ Python โปรแกรม C ++ CGI สามารถโต้ตอบกับระบบภายนอกอื่น ๆ เช่น RDBMS เพื่อแลกเปลี่ยนข้อมูล

ส่วนหัว HTTP

เส้น Content-type:text/html\r\n\r\nเป็นส่วนหนึ่งของส่วนหัว HTTP ซึ่งส่งไปยังเบราว์เซอร์เพื่อทำความเข้าใจเนื้อหา ส่วนหัว HTTP ทั้งหมดจะอยู่ในรูปแบบต่อไปนี้ -

HTTP Field Name: Field Content
 
For Example
Content-type: text/html\r\n\r\n

มีส่วนหัว HTTP ที่สำคัญอื่น ๆ อีกเล็กน้อยซึ่งคุณจะใช้บ่อยในการเขียนโปรแกรม CGI ของคุณ

ซีเนียร์ No ส่วนหัวและคำอธิบาย
1

Content-type:

สตริง MIME ที่กำหนดรูปแบบของไฟล์ที่ส่งคืน ตัวอย่างคือ Content-type: text / html

2

Expires: Date

วันที่ข้อมูลไม่ถูกต้อง เบราว์เซอร์ควรใช้สิ่งนี้เพื่อตัดสินใจว่าจะต้องรีเฟรชหน้าเมื่อใด สตริงวันที่ที่ถูกต้องควรอยู่ในรูปแบบ 01 มกราคม 1998 12:00:00 GMT

3

Location: URL

URL ที่ควรส่งคืนแทน URL ที่ร้องขอ คุณสามารถใช้ไฟล์นี้เพื่อเปลี่ยนเส้นทางคำขอไปยังไฟล์ใดก็ได้

4

Last-modified: Date

วันที่แก้ไขทรัพยากรครั้งล่าสุด

5

Content-length: N

ความยาวเป็นไบต์ของข้อมูลที่ส่งคืน เบราว์เซอร์ใช้ค่านี้เพื่อรายงานเวลาดาวน์โหลดโดยประมาณสำหรับไฟล์

6

Set-Cookie: String

ชุดคุกกี้ผ่านสตริง

ตัวแปรสภาพแวดล้อม CGI

โปรแกรม CGI ทั้งหมดจะสามารถเข้าถึงตัวแปรสภาพแวดล้อมต่อไปนี้ ตัวแปรเหล่านี้มีบทบาทสำคัญในขณะที่เขียนโปรแกรม CGI

ซีเนียร์ No ชื่อตัวแปรและคำอธิบาย
1

CONTENT_TYPE

ชนิดข้อมูลของเนื้อหาที่ใช้เมื่อไคลเอ็นต์ส่งเนื้อหาที่แนบไปยังเซิร์ฟเวอร์ เช่นอัพโหลดไฟล์เป็นต้น

2

CONTENT_LENGTH

ความยาวของข้อมูลแบบสอบถามที่มีให้สำหรับคำขอ POST เท่านั้น

3

HTTP_COOKIE

ส่งคืนชุดคุกกี้ในรูปแบบของคู่คีย์และค่า

4

HTTP_USER_AGENT

ฟิลด์ User-Agent request-header มีข้อมูลเกี่ยวกับตัวแทนผู้ใช้ที่มาจากคำร้องขอ เป็นชื่อของเว็บเบราว์เซอร์

5

PATH_INFO

เส้นทางสำหรับสคริปต์ CGI

6

QUERY_STRING

ข้อมูลเข้ารหัส URL ที่ส่งมาพร้อมกับการร้องขอเมธอด GET

7

REMOTE_ADDR

ที่อยู่ IP ของโฮสต์ระยะไกลที่ทำการร้องขอ สิ่งนี้มีประโยชน์สำหรับการบันทึกหรือเพื่อวัตถุประสงค์ในการตรวจสอบสิทธิ์

8

REMOTE_HOST

ชื่อแบบเต็มของโฮสต์ที่ทำการร้องขอ หากไม่มีข้อมูลนี้คุณสามารถใช้ REMOTE_ADDR เพื่อรับที่อยู่ IR ได้

9

REQUEST_METHOD

วิธีการที่ใช้ในการร้องขอ วิธีการทั่วไปคือ GET และ POST

10

SCRIPT_FILENAME

เส้นทางแบบเต็มไปยังสคริปต์ CGI

11

SCRIPT_NAME

ชื่อของสคริปต์ CGI

12

SERVER_NAME

ชื่อโฮสต์หรือที่อยู่ IP ของเซิร์ฟเวอร์

13

SERVER_SOFTWARE

ชื่อและเวอร์ชันของซอฟต์แวร์ที่เซิร์ฟเวอร์กำลังเรียกใช้

นี่คือโปรแกรม CGI ขนาดเล็กเพื่อแสดงรายการตัวแปร CGI ทั้งหมด

#include <iostream>
#include <stdlib.h>
using namespace std;

const string ENV[ 24 ] = {
   "COMSPEC", "DOCUMENT_ROOT", "GATEWAY_INTERFACE",   
   "HTTP_ACCEPT", "HTTP_ACCEPT_ENCODING",             
   "HTTP_ACCEPT_LANGUAGE", "HTTP_CONNECTION",         
   "HTTP_HOST", "HTTP_USER_AGENT", "PATH",            
   "QUERY_STRING", "REMOTE_ADDR", "REMOTE_PORT",      
   "REQUEST_METHOD", "REQUEST_URI", "SCRIPT_FILENAME",
   "SCRIPT_NAME", "SERVER_ADDR", "SERVER_ADMIN",      
   "SERVER_NAME","SERVER_PORT","SERVER_PROTOCOL",     
   "SERVER_SIGNATURE","SERVER_SOFTWARE" };   

int main () {
   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>CGI Environment Variables</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";
   cout << "<table border = \"0\" cellspacing = \"2\">";

   for ( int i = 0; i < 24; i++ ) {
      cout << "<tr><td>" << ENV[ i ] << "</td><td>";
      
      // attempt to retrieve value of environment variable
      char *value = getenv( ENV[ i ].c_str() );  
      if ( value != 0 ) {
         cout << value;                                 
      } else {
         cout << "Environment variable does not exist.";
      }
      cout << "</td></tr>\n";
   }
   
   cout << "</table><\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

C ++ CGI ไลบรารี

สำหรับตัวอย่างจริงคุณจะต้องดำเนินการหลายอย่างโดยโปรแกรม CGI ของคุณ มีไลบรารี CGI ที่เขียนขึ้นสำหรับโปรแกรม C ++ ซึ่งคุณสามารถดาวน์โหลดได้จากftp://ftp.gnu.org/gnu/cgicc/และทำตามขั้นตอนเพื่อติดตั้งไลบรารี -

$tar xzf cgicc-X.X.X.tar.gz 
$cd cgicc-X.X.X/ 
$./configure --prefix=/usr 
$make
$make install

คุณสามารถตรวจสอบเอกสารที่เกี่ยวข้องสามารถดูได้ที่'C ++ CGI Lib เอกสาร

รับและโพสต์วิธีการ

คุณต้องเจอสถานการณ์ต่างๆมากมายเมื่อคุณต้องส่งข้อมูลบางอย่างจากเบราว์เซอร์ของคุณไปยังเว็บเซิร์ฟเวอร์และท้ายที่สุดไปยังโปรแกรม CGI ของคุณ เบราว์เซอร์ส่วนใหญ่ใช้สองวิธีในการส่งข้อมูลนี้ไปยังเว็บเซิร์ฟเวอร์ วิธีการเหล่านี้คือ GET Method และ POST Method

การส่งผ่านข้อมูลโดยใช้วิธี GET

เมธอด GET จะส่งข้อมูลผู้ใช้ที่เข้ารหัสต่อท้ายคำขอเพจ หน้าและข้อมูลที่เข้ารหัสจะถูกคั่นด้วยเครื่องหมาย? ตัวละครดังนี้ -

http://www.test.com/cgi-bin/cpp.cgi?key1=value1&key2=value2

เมธอด GET เป็นวิธีการเริ่มต้นในการส่งผ่านข้อมูลจากเบราว์เซอร์ไปยังเว็บเซิร์ฟเวอร์และจะสร้างสตริงแบบยาวที่ปรากฏในกล่องตำแหน่งของเบราว์เซอร์ของคุณ อย่าใช้เมธอด GET หากคุณมีรหัสผ่านหรือข้อมูลที่ละเอียดอ่อนอื่น ๆ เพื่อส่งผ่านไปยังเซิร์ฟเวอร์ เมธอด GET มีข้อ จำกัด ด้านขนาดและคุณสามารถส่งอักขระได้ไม่เกิน 1024 ตัวในสตริงคำขอ

เมื่อใช้เมธอด GET ข้อมูลจะถูกส่งผ่านโดยใช้ส่วนหัว QUERY_STRING http และจะสามารถเข้าถึงได้ในโปรแกรม CGI ของคุณผ่านตัวแปรสภาพแวดล้อม QUERY_STRING

คุณสามารถส่งผ่านข้อมูลได้เพียงแค่เชื่อมคู่คีย์และค่าเข้ากับ URL ใด ๆ หรือคุณสามารถใช้แท็ก HTML <FORM> เพื่อส่งผ่านข้อมูลโดยใช้เมธอด GET

ตัวอย่าง URL แบบง่าย: รับวิธีการ

นี่คือ URL ง่ายๆซึ่งจะส่งผ่านค่าสองค่าไปยังโปรแกรม hello_get.py โดยใช้เมธอด GET

/cgi-bin/cpp_get.cgi?first_name=ZARA&last_name=ALI

ด้านล่างนี้คือโปรแกรมในการสร้าง cpp_get.cgiโปรแกรม CGI เพื่อจัดการอินพุตที่กำหนดโดยเว็บเบราว์เซอร์ เราจะใช้ไลบรารี C ++ CGI ซึ่งทำให้ง่ายต่อการเข้าถึงข้อมูลที่ส่งผ่าน -

#include <iostream>
#include <vector>  
#include <string>  
#include <stdio.h>  
#include <stdlib.h> 

#include <cgicc/CgiDefs.h> 
#include <cgicc/Cgicc.h> 
#include <cgicc/HTTPHTMLHeader.h> 
#include <cgicc/HTMLClasses.h>  

using namespace std;
using namespace cgicc;

int main () {
   Cgicc formData;
   
   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>Using GET and POST Methods</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   form_iterator fi = formData.getElement("first_name");  
   if( !fi->isEmpty() && fi != (*formData).end()) {  
      cout << "First name: " << **fi << endl;  
   } else {
      cout << "No text entered for first name" << endl;  
   }
   
   cout << "<br/>\n";
   fi = formData.getElement("last_name");  
   if( !fi->isEmpty() &&fi != (*formData).end()) {  
      cout << "Last name: " << **fi << endl;  
   } else {
      cout << "No text entered for last name" << endl;  
   }
   
   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

ตอนนี้รวบรวมโปรแกรมข้างต้นดังนี้ -

$g++ -o cpp_get.cgi cpp_get.cpp -lcgicc

สร้าง cpp_get.cgi และใส่ไว้ในไดเรกทอรี CGI ของคุณและพยายามเข้าถึงโดยใช้ลิงค์ต่อไปนี้ -

/cgi-bin/cpp_get.cgi?first_name=ZARA&last_name=ALI

สิ่งนี้จะสร้างผลลัพธ์ต่อไปนี้ -

First name: ZARA 
Last name: ALI

ตัวอย่างแบบฟอร์มอย่างง่าย: GET Method

นี่คือตัวอย่างง่ายๆที่ส่งผ่านค่าสองค่าโดยใช้รูปแบบ HTML และปุ่มส่ง เราจะใช้สคริปต์ CGI เดียวกัน cpp_get.cgi เพื่อจัดการอินพุตนี้

<form action = "/cgi-bin/cpp_get.cgi" method = "get">
   First Name: <input type = "text" name = "first_name">  <br />
 
   Last Name: <input type = "text" name = "last_name" />
   <input type = "submit" value = "Submit" />
</form>

นี่คือผลลัพธ์จริงของแบบฟอร์มด้านบน คุณป้อนชื่อและนามสกุลจากนั้นคลิกปุ่มส่งเพื่อดูผลลัพธ์

การส่งข้อมูลโดยใช้วิธี POST

วิธีการส่งข้อมูลไปยังโปรแกรม CGI ที่น่าเชื่อถือกว่าโดยทั่วไปคือวิธีการโพสต์ ข้อมูลนี้จะบรรจุข้อมูลในลักษณะเดียวกับเมธอด GET แต่แทนที่จะส่งเป็นสตริงข้อความหลังจาก a? ใน URL จะส่งเป็นข้อความแยกต่างหาก ข้อความนี้มาในสคริปต์ CGI ในรูปแบบของอินพุตมาตรฐาน

โปรแกรม cpp_get.cgi เดียวกันจะจัดการเมธอด POST เช่นกัน ให้เราใช้ตัวอย่างเดียวกับด้านบนซึ่งส่งผ่านค่าสองค่าโดยใช้ HTML FORM และปุ่มส่ง แต่คราวนี้ใช้วิธีการ POST ดังนี้ -

<form action = "/cgi-bin/cpp_get.cgi" method = "post">
   First Name: <input type = "text" name = "first_name"><br />
   Last Name: <input type = "text" name = "last_name" />
 
   <input type = "submit" value = "Submit" />
</form>

นี่คือผลลัพธ์จริงของแบบฟอร์มด้านบน คุณป้อนชื่อและนามสกุลจากนั้นคลิกปุ่มส่งเพื่อดูผลลัพธ์

การส่งข้อมูลช่องทำเครื่องหมายไปยังโปรแกรม CGI

ช่องทำเครื่องหมายถูกใช้เมื่อจำเป็นต้องเลือกมากกว่าหนึ่งตัวเลือก

นี่คือตัวอย่างโค้ด HTML สำหรับฟอร์มที่มีช่องทำเครื่องหมายสองช่อง -

<form action = "/cgi-bin/cpp_checkbox.cgi" method = "POST" target = "_blank">
   <input type = "checkbox" name = "maths" value = "on" /> Maths
   <input type = "checkbox" name = "physics" value = "on" /> Physics
   <input type = "submit" value = "Select Subject" />
</form>

ผลลัพธ์ของรหัสนี้เป็นรูปแบบต่อไปนี้ -

ด้านล่างนี้คือโปรแกรม C ++ ซึ่งจะสร้างสคริปต์ cpp_checkbox.cgi เพื่อจัดการอินพุตที่เว็บเบราว์เซอร์กำหนดผ่านปุ่มช่องทำเครื่องหมาย

#include <iostream>
#include <vector>  
#include <string>  
#include <stdio.h>  
#include <stdlib.h> 

#include <cgicc/CgiDefs.h> 
#include <cgicc/Cgicc.h> 
#include <cgicc/HTTPHTMLHeader.h> 
#include <cgicc/HTMLClasses.h> 

using namespace std;
using namespace cgicc;

int main () {
   Cgicc formData;
   bool maths_flag, physics_flag;

   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>Checkbox Data to CGI</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   maths_flag = formData.queryCheckbox("maths");
   if( maths_flag ) {  
      cout << "Maths Flag: ON " << endl;  
   } else {
      cout << "Maths Flag: OFF " << endl;  
   }
   cout << "<br/>\n";

   physics_flag = formData.queryCheckbox("physics");
   if( physics_flag ) {  
      cout << "Physics Flag: ON " << endl;  
   } else {
      cout << "Physics Flag: OFF " << endl;  
   }
   
   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

การส่งผ่านข้อมูลปุ่มตัวเลือกไปยังโปรแกรม CGI

ปุ่มวิทยุจะใช้เมื่อต้องเลือกเพียงตัวเลือกเดียว

นี่คือตัวอย่างโค้ด HTML สำหรับแบบฟอร์มที่มีปุ่มตัวเลือกสองปุ่ม -

<form action = "/cgi-bin/cpp_radiobutton.cgi" method = "post" target = "_blank">
   <input type = "radio" name = "subject" value = "maths" checked = "checked"/> Maths 
   <input type = "radio" name = "subject" value = "physics" /> Physics
   <input type = "submit" value = "Select Subject" />
</form>

ผลลัพธ์ของรหัสนี้เป็นรูปแบบต่อไปนี้ -

ด้านล่างนี้คือโปรแกรม C ++ ซึ่งจะสร้างสคริปต์ cpp_radiobutton.cgi เพื่อจัดการอินพุตที่เว็บเบราว์เซอร์กำหนดผ่านปุ่มตัวเลือก

#include <iostream>
#include <vector>  
#include <string>  
#include <stdio.h>  
#include <stdlib.h> 

#include <cgicc/CgiDefs.h> 
#include <cgicc/Cgicc.h> 
#include <cgicc/HTTPHTMLHeader.h> 
#include <cgicc/HTMLClasses.h> 

using namespace std;
using namespace cgicc;

int main () {
   Cgicc formData;
  
   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>Radio Button Data to CGI</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   form_iterator fi = formData.getElement("subject");  
   if( !fi->isEmpty() && fi != (*formData).end()) {  
      cout << "Radio box selected: " << **fi << endl;  
   }
  
   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

การส่งผ่านข้อมูลพื้นที่ข้อความไปยังโปรแกรม CGI

องค์ประกอบ TEXTAREA ใช้เมื่อต้องส่งข้อความหลายบรรทัดไปยังโปรแกรม CGI

นี่คือตัวอย่างโค้ด HTML สำหรับแบบฟอร์มที่มีกล่อง TEXTAREA -

<form action = "/cgi-bin/cpp_textarea.cgi" method = "post" target = "_blank">
   <textarea name = "textcontent" cols = "40" rows = "4">
      Type your text here...
   </textarea>
   <input type = "submit" value = "Submit" />
</form>

ผลลัพธ์ของรหัสนี้เป็นรูปแบบต่อไปนี้ -

ด้านล่างนี้คือโปรแกรม C ++ ซึ่งจะสร้างสคริปต์ cpp_textarea.cgi เพื่อจัดการอินพุตที่เว็บเบราว์เซอร์กำหนดผ่านพื้นที่ข้อความ

#include <iostream>
#include <vector>  
#include <string>  
#include <stdio.h>  
#include <stdlib.h> 

#include <cgicc/CgiDefs.h> 
#include <cgicc/Cgicc.h> 
#include <cgicc/HTTPHTMLHeader.h> 
#include <cgicc/HTMLClasses.h> 

using namespace std;
using namespace cgicc;

int main () {
   Cgicc formData;
  
   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>Text Area Data to CGI</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   form_iterator fi = formData.getElement("textcontent");  
   if( !fi->isEmpty() && fi != (*formData).end()) {  
      cout << "Text Content: " << **fi << endl;  
   } else {
      cout << "No text entered" << endl;  
   }
  
   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

การส่งผ่านข้อมูลแบบหล่นลงไปยังโปรแกรม CGI

Drop down Box ใช้เมื่อเรามีตัวเลือกมากมาย แต่จะเลือกเพียงหนึ่งหรือสองตัวเท่านั้น

นี่คือตัวอย่างโค้ด HTML สำหรับแบบฟอร์มที่มีช่องแบบเลื่อนลง -

<form action = "/cgi-bin/cpp_dropdown.cgi" method = "post" target = "_blank">
   <select name = "dropdown">
      <option value = "Maths" selected>Maths</option>
      <option value = "Physics">Physics</option>
   </select>
   
   <input type = "submit" value = "Submit"/>
</form>

ผลลัพธ์ของรหัสนี้เป็นรูปแบบต่อไปนี้ -

ด้านล่างนี้คือโปรแกรม C ++ ซึ่งจะสร้างสคริปต์ cpp_dropdown.cgi เพื่อจัดการอินพุตที่เว็บเบราว์เซอร์มอบให้ผ่านช่องแบบเลื่อนลง

#include <iostream>
#include <vector>  
#include <string>  
#include <stdio.h>  
#include <stdlib.h> 

#include <cgicc/CgiDefs.h> 
#include <cgicc/Cgicc.h> 
#include <cgicc/HTTPHTMLHeader.h> 
#include <cgicc/HTMLClasses.h> 

using namespace std;
using namespace cgicc;

int main () {
   Cgicc formData;
  
   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>Drop Down Box Data to CGI</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   form_iterator fi = formData.getElement("dropdown");  
   if( !fi->isEmpty() && fi != (*formData).end()) {  
      cout << "Value Selected: " << **fi << endl;  
   }
  
   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

การใช้คุกกี้ใน CGI

โปรโตคอล HTTP คือโปรโตคอลไร้สัญชาติ แต่สำหรับเว็บไซต์เชิงพาณิชย์จำเป็นต้องรักษาข้อมูลเซสชันระหว่างหน้าต่างๆ ตัวอย่างเช่นการลงทะเบียนผู้ใช้หนึ่งสิ้นสุดลงหลังจากเสร็จสิ้นหลายหน้า แต่จะรักษาข้อมูลเซสชันของผู้ใช้ในหน้าเว็บทั้งหมดได้อย่างไร

ในหลาย ๆ สถานการณ์การใช้คุกกี้เป็นวิธีที่มีประสิทธิภาพที่สุดในการจดจำและติดตามการตั้งค่าการซื้อค่าคอมมิชชั่นและข้อมูลอื่น ๆ ที่จำเป็นสำหรับประสบการณ์ของผู้เยี่ยมชมหรือสถิติไซต์ที่ดีขึ้น

มันทำงานอย่างไร

เซิร์ฟเวอร์ของคุณส่งข้อมูลบางส่วนไปยังเบราว์เซอร์ของผู้เยี่ยมชมในรูปแบบของคุกกี้ เบราว์เซอร์อาจยอมรับคุกกี้ หากเป็นเช่นนั้นระบบจะจัดเก็บเป็นบันทึกข้อความธรรมดาในฮาร์ดไดรฟ์ของผู้เยี่ยมชม ตอนนี้เมื่อผู้เยี่ยมชมเข้ามาที่หน้าอื่นในไซต์ของคุณคุกกี้จะพร้อมสำหรับการเรียกคืน เมื่อดึงข้อมูลเซิร์ฟเวอร์ของคุณจะรู้ / จำสิ่งที่เก็บไว้

คุกกี้คือบันทึกข้อมูลข้อความธรรมดาของฟิลด์ความยาวตัวแปร 5 ช่อง -

  • Expires- แสดงวันที่คุกกี้จะหมดอายุ หากว่างเปล่าคุกกี้จะหมดอายุเมื่อผู้เยี่ยมชมออกจากเบราว์เซอร์

  • Domain - แสดงชื่อโดเมนของไซต์ของคุณ

  • Path- แสดงเส้นทางไปยังไดเรกทอรีหรือหน้าเว็บที่ตั้งค่าคุกกี้ ซึ่งอาจว่างเปล่าหากคุณต้องการดึงคุกกี้จากไดเร็กทอรีหรือเพจใด ๆ

  • Secure- หากช่องนี้มีคำว่า "ปลอดภัย" คุกกี้จะถูกเรียกคืนด้วยเซิร์ฟเวอร์ที่ปลอดภัยเท่านั้น หากฟิลด์นี้ว่างแสดงว่าไม่มีข้อ จำกัด ดังกล่าว

  • Name = Value - คุกกี้ถูกตั้งค่าและเรียกดูในรูปแบบของคู่คีย์และค่า

การตั้งค่าคุกกี้

การส่งคุกกี้ไปยังเบราว์เซอร์นั้นง่ายมาก คุกกี้เหล่านี้จะถูกส่งไปพร้อมกับ HTTP Header ก่อนที่จะมีการยื่นประเภทเนื้อหา สมมติว่าคุณต้องการตั้งค่า UserID และรหัสผ่านเป็นคุกกี้ ดังนั้นการตั้งค่าคุกกี้จะทำได้ดังนี้

#include <iostream>
using namespace std;

int main () {
   cout << "Set-Cookie:UserID = XYZ;\r\n";
   cout << "Set-Cookie:Password = XYZ123;\r\n";
   cout << "Set-Cookie:Domain = www.tutorialspoint.com;\r\n";
   cout << "Set-Cookie:Path = /perl;\n";
   cout << "Content-type:text/html\r\n\r\n";

   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>Cookies in CGI</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   cout << "Setting cookies" << endl;  
  
   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

จากตัวอย่างนี้คุณต้องเข้าใจวิธีตั้งค่าคุกกี้ เราใช้Set-Cookie HTTP header เพื่อตั้งค่าคุกกี้

ที่นี่เป็นทางเลือกในการตั้งค่าแอตทริบิวต์คุกกี้เช่น Expires, Domain และ Path เป็นที่น่าสังเกตว่าคุกกี้จะถูกตั้งค่าก่อนที่จะส่งสายเวทย์มนตร์"Content-type:text/html\r\n\r\n.

รวบรวมโปรแกรมด้านบนเพื่อสร้าง setcookies.cgi และพยายามตั้งค่าคุกกี้โดยใช้ลิงค์ต่อไปนี้ มันจะตั้งค่าคุกกี้สี่ตัวที่คอมพิวเตอร์ของคุณ -

/cgi-bin/setcookies.cgi

การดึงคุกกี้

ง่ายต่อการเรียกดูคุกกี้ชุดทั้งหมด คุกกี้จะถูกเก็บไว้ใน HTTP_COOKIE ตัวแปรสภาพแวดล้อม CGI และจะมีรูปแบบต่อไปนี้

key1 = value1; key2 = value2; key3 = value3....

นี่คือตัวอย่างวิธีการดึงข้อมูลคุกกี้

#include <iostream>
#include <vector>  
#include <string>  
#include <stdio.h>  
#include <stdlib.h> 

#include <cgicc/CgiDefs.h> 
#include <cgicc/Cgicc.h> 
#include <cgicc/HTTPHTMLHeader.h> 
#include <cgicc/HTMLClasses.h>

using namespace std;
using namespace cgicc;

int main () {
   Cgicc cgi;
   const_cookie_iterator cci;

   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>Cookies in CGI</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";
   cout << "<table border = \"0\" cellspacing = \"2\">";
   
   // get environment variables
   const CgiEnvironment& env = cgi.getEnvironment();

   for( cci = env.getCookieList().begin();
   cci != env.getCookieList().end(); 
   ++cci ) {
      cout << "<tr><td>" << cci->getName() << "</td><td>";
      cout << cci->getValue();                                 
      cout << "</td></tr>\n";
   }
   
   cout << "</table><\n";
   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

ตอนนี้รวบรวมโปรแกรมด้านบนเพื่อสร้าง getcookies.cgi และพยายามรับรายการคุกกี้ทั้งหมดที่มีอยู่ในคอมพิวเตอร์ของคุณ -

/cgi-bin/getcookies.cgi

สิ่งนี้จะสร้างรายการคุกกี้ทั้งสี่ชุดในส่วนก่อนหน้าและคุกกี้อื่น ๆ ทั้งหมดที่ตั้งไว้ในคอมพิวเตอร์ของคุณ -

UserID XYZ 
Password XYZ123 
Domain www.tutorialspoint.com 
Path /perl

ตัวอย่างการอัปโหลดไฟล์

ในการอัปโหลดไฟล์รูปแบบ HTML ต้องมีแอตทริบิวต์ enctype ตั้งค่าเป็น multipart/form-data. แท็กอินพุตที่มีประเภทไฟล์จะสร้างปุ่ม "เรียกดู"

<html>
   <body>
      <form enctype = "multipart/form-data" action = "/cgi-bin/cpp_uploadfile.cgi"
         method = "post">
         <p>File: <input type = "file" name = "userfile" /></p>
         <p><input type = "submit" value = "Upload" /></p>
      </form>
   </body>
</html>

ผลลัพธ์ของรหัสนี้เป็นรูปแบบต่อไปนี้ -

Note- ตัวอย่างด้านบนถูกปิดใช้งานโดยเจตนาเพื่อหยุดไม่ให้ผู้อื่นอัปโหลดไฟล์บนเซิร์ฟเวอร์ของเรา แต่คุณสามารถลองใช้โค้ดด้านบนกับเซิร์ฟเวอร์ของคุณได้

นี่คือสคริปต์ cpp_uploadfile.cpp เพื่อจัดการการอัปโหลดไฟล์ -

#include <iostream>
#include <vector>  
#include <string>  
#include <stdio.h>  
#include <stdlib.h> 

#include <cgicc/CgiDefs.h> 
#include <cgicc/Cgicc.h> 
#include <cgicc/HTTPHTMLHeader.h> 
#include <cgicc/HTMLClasses.h>

using namespace std;
using namespace cgicc;

int main () {
   Cgicc cgi;

   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>File Upload in CGI</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   // get list of files to be uploaded
   const_file_iterator file = cgi.getFile("userfile");
   if(file != cgi.getFiles().end()) {
      // send data type at cout.
      cout << HTTPContentHeader(file->getDataType());
      // write content at cout.
      file->writeToStream(cout);
   }
   cout << "<File uploaded successfully>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

ตัวอย่างข้างต้นใช้สำหรับการเขียนเนื้อหาที่ cout สตรีม แต่คุณสามารถเปิดสตรีมไฟล์ของคุณและบันทึกเนื้อหาของไฟล์ที่อัปโหลดในไฟล์ในตำแหน่งที่ต้องการ

หวังว่าคุณจะสนุกกับบทช่วยสอนนี้ ถ้าใช่โปรดส่งความคิดเห็นของคุณถึงเรา