بدءًا من هذه المحاضرة، سندخل في عملية تعلم برمجة 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 عن Java أو JavaScript حيث تتم معالجتها من جانب الخادم وليس من جانب العميل، وهذا مشابه لبرامج CGI. بالطبع، ضمن النطاق الوظيفي لـ SSI، فإن مزاياها هي نفس مزايا برامج CGI، حيث يمكنها تحسين استخدام موارد الخادم، ويمكن لأي متصفح ويب على العميل تصفح نص HTML الذي يحتوي على SSI.
فيما يلي ستة أوامر SSI شائعة الاستخدام:
(١) أي يشمل الأمر
(٢) أمر الصدى
(3) الأمر التنفيذي
(4) أمر التكوين
(5) الأمر fsize
(6) أمر فلاش مود
تضمين الأمر
المعلمة الوحيدة المدعومة هي الملف، الذي يقوم بإدراج محتويات الملف المحدد بواسطة معلمة الملف في نص HTML الحالي. إذا كنت تعرف لغة C، يمكنك أن ترى أن لها نفس وظيفة الأمر "#include" في لغة C. على سبيل المثال، هناك نصان بتنسيق HTML: main.html وheader.html استخدم أمر التضمين في main.html: main.html:
<أتش تي أم أل>
< Tilt> اختبار تضمين أمر SSI </ /title>
< !--#include file="header.html" -->
<الجسم>
الرأس أعلاه يأتي من header.html!
</الجسم>
</أتش تي أم أل>
header.html:
< H1> هذا عنوان في header.html </H1>
(ومع ذلك، يبدو أن OmniHTTPD لا يدعم أمر التضمين، :< !)
أمر الصدى
المعلمة الوحيدة المدعومة هي var، والتي تُستخدم لعرض المتغيرات المقدمة من الخادم، على سبيل المثال:
DOCUMENT_NAME: اسم الملف الحالي
DOCUMENT_URL: المسار النسبي لنص SSI
DATE_LOCAL: التاريخ المحلي
DATE_GMT: التاريخ بتوقيت جرينتش (توقيت جرينتش القياسي).
LAST_MODIFIED: تاريخ آخر تعديل للملف الذي يحتوي على أمر SSI هذا
HTTP_USER_AGENT: اسم المتصفح.
على سبيل المثال: main.shtml <html>
تم تحديث هذا المستند آخر مرة في < !--#echo var="LAST_MODIFIED"-->
</أتش تي أم أل>
عند فتح 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
يعرض هذا الأمر حجم ملف معين. المعلمة عبارة عن ملف، تحدد المسار واسم الملف.
أمر فلاش مود
يعرض هذا الأمر تاريخ آخر تعديل للملف المحدد. المعلمة عبارة عن ملف، تحدد المسار واسم الملف.
2. البوابة: ربط البروتوكولات الأخرى عبر الويب
لا يمكن لبروتوكول HTTP الوصول إلى كافة الموارد الموجودة على الإنترنت. عندما تريد الوصول إلى موارد أخرى غير بروتوكول HTTP (مثل POP3 وSMTP لإرسال واستقبال رسائل البريد الإلكتروني)، فأنت بحاجة إلى بوابة. يعد برنامج CGI طريقة جيدة لتنفيذ البوابة.
يتم توفير بعض البوابات شائعة الاستخدام في العديد من خوادم UNIX HTTP، مثل Finger وwais وarchie وما إلى ذلك. ولكن في OmniHTTPD، لا يتم توفير هذه البوابات. ولكن يمكننا إضافة وظيفة البوابة إلى OmniHTTPD عن طريق كتابة برامج CGI.
النماذج ومعالجتها
تعد نماذج HTML جزءًا من مستندات الويب وتستخدم لإرسال المعلومات التي يملأها المستخدمون إلى الخادم. عادة، يتم تمرير هذه المعلومات إلى برنامج CGI، الذي ينفذ سلسلة من العمليات أو معالجة البيانات بناءً على المعلومات المدخلة، ثم يقوم بإنشاء مستند HTML يمثل نتائج المعالجة ويرسله مرة أخرى إلى متصفح العميل.
يمكن ملاحظة أن الجزء الرئيسي من برنامج CGI هو الحصول على بيانات الإدخال وإنشاء مستندات HTML، في حين أن أجزاء التشغيل ومعالجة البيانات هي نفسها مثل معظم التطبيقات. في هذه المحاضرة، سأقدم كيفية الحصول على البيانات وإخراج مستندات HTML في Perl وDelphi.
أولاً، نقوم بإنشاء مستند HTML باسم Greeting.html:
ملف Greeting.html (المخزن في دليل HtDocs الخاص بـ OmniHTTPD)
<أتش تي أم أل>
<الرأس>
<title>هذه صفحة ترحيب </title>
< h1> تحية </ /h1>
<الجسم>
<ساعة>
< نموذج الإجراء = "/cgi-bin/greeting.pl" طريقة = POST>
< p> اسمك الأول: < نوع الإدخال = اسم النص = "الاسم الأول" الحجم = 60 الحد الأقصى للطول = 80> </p>
< p> اسمك الأخير: < input type=text name="lastname" size=60 maxlength=80> </p>
<ساعة>
< p> < input type=submit value = "الكل موافق!"> < نوع الإدخال = إعادة تعيين القيمة = "مسح الكل"> </p>
< / النموذج>
</الجسم>
</أتش تي أم أل>
هنا تحية برنامج Perl CGI.pl:
ملف Greeting.pl (المخزن في دليل cgi-bin الخاص بـ OmniHTTPD) # تحية لك!
تتطلب "cgi-lib.pl"؛
# =========================================================================
# الحصول على قيم الإدخال
&قراءة التحليل(*الإدخال);
$mFirstName = $input{'firstname'};
$mLastName = $input{'lastname'};
# ================================================================================
# قم ببعض العمليات هنا
$mFullName = "$mFirstName $mLastName";
# =========================================================================
# إنشاء مستند HTML للإخراج
برينت&PrintHeader;
طباعة "< html>< head>< title> تحية طيبة لك! </title>< /head> ";
طباعة "< body> مرحبًا، < i>$mFullName< /i> ! ";
طباعة "< hr> بواسطة Greeting.pl </body>< /html>";
# ================================================================================
# تم كل شيء!
قم باختبار برنامج CGI من خلال تصفح http://localhost/greeting.html.
في برنامج Perl أعلاه، كبرنامج CGI، يجب عليك استخدام "cgi-lib.pl" للإشارة إلى ملف cgi-lib.pl. يحتوي هذا الملف على العديد من الوظائف والإجراءات لبرمجة CGI. يتطلب الأمر ما يعادل #include في لغة C، ولكن تجدر الإشارة إلى أنه يجب أن تكون هناك فاصلة منقوطة بعد عبارة الطلب.
تقوم عملية ReadParse بقراءة البيانات المرسلة بواسطة نموذج HTML، وتكون المعلمة عبارة عن مؤشر صفيف. تجدر الإشارة إلى أنه في لغة Perl، يجب أن يسبق استدعاءات الوظائف والإجراء رمز &.
mFirstName وmLastName وmFullName هي متغيرات. في لغة Perl، يجب أن تكون أسماء المتغيرات مسبوقة بعلامة $.
قيمة الإرجاع الفعلية لوظيفة PrintHeader هي "نوع المحتوى: نص/html"، والتي تخبر المتصفح أن البيانات التالية هي مستند HTML.
يعد إنشاء مستند HTML أمرًا بسيطًا للغاية، ما عليك سوى استخدام عبارة الطباعة لإخراج محتوى مستند HTML. ماذا عن ذلك؟ هل يمكنك استخدام لغة Perl لكتابة برامج CGI؟
بعد ذلك، لنكتب برنامج دلفي لإنجاز نفس الوظيفة:
قم أولاً بإغلاق جميع المشاريع في دلفي، وحدد القائمة ملف/جديد، ثم حدد نوع تطبيق خادم الويب في مربع الحوار، واستخدم خيار CGI المستقل القابل للتنفيذ. وسيظهر مشروع جديد باسم النافذة الرئيسية WebModule1.
انقر نقرًا مزدوجًا بالماوس على خاصية الإجراءات الخاصة بـ WebModule1، وستظهر نافذة تحرير خاصية الإجراءات. أنشئ إجراءً جديدًا في النافذة، باسم WebActionItem1، واضبط الخاصية الافتراضية الخاصة به على True، ثم انقر نقرًا مزدوجًا فوق حدث OnAction في الأحداث الخاصة به، وأضف التعليمة البرمجية التالية:
الإجراء TWebModule1.WebModule1WebActionItem1Action(Sender: TObject;Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
فار
mFirstName، mLastName، mFullName: سلسلة؛
هتملدوك: سلسلة؛
يبدأ
// الحصول على قيم الإدخال:
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> بواسطة Greeting.cgi < /body>< /html>';
Response.Content := HtmlDoc;
نهاية؛
احفظ وحدة هذا المشروع باسم cgimain.pas والمشروع باسم Greeting.dpr. بعد التجميع (باستخدام Ctrl+F9)، انسخ Greeting.exe إلى دليل cgi-bin الخاص بـ OmniHTTPD وأعد تسميته إلى Greeting.cgi. وفي الوقت نفسه، قم بإجراء التعديلات التالية على Greeting.html الذي كتبناه سابقًا:
قم بتغيير طريقة <form action="/cgi-bin/greeting.pl"=POST> إلى
< نموذج الإجراء = "/cgi-bin/greeting.cgi" طريقة = POST>
بهذه الطريقة، يمكنك اختبار برامج CGI المكتوبة بلغة دلفي من خلال تصفح http://localhost/greeting.html.
كما يتبين من هذا البرنامج، في دلفي، يحدث حدث OnAction الخاص بـ WebActionItem بمجرد حصول برنامج CGI على طلب. في هذه الحالة، يتم إدخال البيانات وإنشاء مستند HTML على النحو التالي:
احصل على قيمة عنصر النموذج من خلال Request.ContentFields.Values[اسم عنصر نموذج HTML].
قم بإنشاء مستندات HTML عن طريق تعيين قيمة لـ Response.Content.
وفيما يلي محتوى الملفات الثلاثة لبرنامج دلفي: ------------------------------------ ---- -------------------
تحية.dpr :
تحية البرنامج؛
{$APPTYPE CONSOLE}
الاستخدامات
تطبيق HTTP,
سي جي آي آب,
cgimain في 'cgimain.pas' {WebModule1: TWebModule};
{$E سي جي آي}
{$R *.RES}
يبدأ
Application.Initialize;
Application.CreateForm(TWebModule1, WebModule1);
Application.Run;
نهاية.
-------------------------------------------------- ----------
cgimain.pas:
وحدة كجيمين؛
واجهة
يستخدم Windows، الرسائل، SysUtils، Classes، HTTPApp؛
يكتب
TWebModule1 = فئة (TWebModule)
الإجراء WebModule1WebActionItem1Action(Sender: TObject;Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
خاص
{تصريحات خاصة}
عام
{التصريحات العامة}
نهاية؛
فار
WebModule1: TWebModule1;
تطبيق
{$R *.DFM}
الإجراء TWebModule1.WebModule1WebActionItem1Action(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
فار
mFirstName، mLastName، mFullName: سلسلة؛
هتملدوك: سلسلة؛
يبدأ
// الحصول على قيم الإدخال:
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> بواسطة Greeting.cgi < /body>< /html>';
Response.Content := HtmlDoc;
نهاية؛
نهاية.
-------------------------------------------------- ----------
cgimain.dfm:
كائن WebModule1: TWebModule1
OldCreateOrder = خطأ
الإجراءات = <
غرض
الافتراضي = صحيح
الاسم = 'WebActionItem1'
OnAction = WebModule1WebActionItem1Action
نهاية>
اليسار = 192
الأعلى = 107
الارتفاع = 150
العرض = 215
نهاية