توضح هذه المقالة بشكل أساسي كيفية جعل DELPHI والإنترنت يعملان معًا. سيتم تفصيل تقنيتين متخصصتين في هذه المقالة:
WININET: بناء برامج عملاء FTP وHTTP وGopher ISAPI: توسيع خدمات معلومات الإنترنت، على سبيل المثال، الحصول على معلومات على الخادم وعرضها على المتصفح.
في عالم الكمبيوتر اليوم، بدأ اتجاه تطور ضخم بسبب استراتيجية الإنترنت التي تتبعها Microsoft. أولئك الذين يصنعون
لقد ولت أخيرًا أيام CGI (واجهة البوابة العامة) وأدوات الطرف الثالث حتى لأدوات الإنترنت الأساسية. ستكون هناك دائمًا حاجة إلى أدوات متطورة تابعة لجهات خارجية، ولكن الآن سيجد المبرمجون مجموعة واسعة من أدوات الإنترنت التي يحتاجونها مضمنة في نظام التشغيل. باختصار، بدون مزيد من الاستثمار، يمكنك استخدام موارد DELPHI المجانية من أجل:
* تطوير متصفح الويب
* تشغيل FTP وHTTP وGopher بين تطبيقين DELPHI أو تطبيق DELPHI وTCP
(بروتوكول التحكم في الإرسال) يقوم بتشغيل TCP بين الخوادم
لأن DELPHI يمكنها بسهولة الاتصال بـ Windows API وتدعم OCX/ActiveX، وهي استراتيجية Microsoft الجديدة
تتناسب الإستراتيجية تمامًا مع خطتنا. تنتج Microsoft الأدوات، ويجني مبرمجو DELPHI الثمار!
ماذا يوجد في هذه المقالة؟
تحتوي هذه المقالة على ثلاثة أجزاء رئيسية وبعض الأجزاء الصغيرة، مع ثلاثة محاور رئيسية:
*ابحث عن المواد: الوثائق الفنية المذكورة في هذه المقالة متاحة هناك وتتضمن وصفًا موجزًا للأجهزة والبرامج التي ستحتاجها لتشغيل التعليمات البرمجية في هذه المقالة.
*ISAPI: كيفية استخدام ISAPI
*WININET: كيفية استخدام WININET
في معظم الحالات، يكون قسما ISAPI وWININET في هذه المقالة مستقلين تمامًا، ويمكنك اختيار الترتيب الذي تريد قراءتهما به.
ابحث عن المعلومات ومتطلبات الأجهزة والبرامج
ستحتاج إلى نسخة من Microsoft Windows NT 3.51 Server أو NT 4.0 Server، والتي يجب أن تكون مصحوبة بوثائق خدمات معلومات الإنترنت، لأنك ستحتاج إلى فهم التقنيات المذكورة فيها. يجب تضمين هذا المستند مع NT Server4.0، ويمكن لمستخدمي NT 3.51 تنزيله من موقع Microsoft على الويب. لتشغيل Windows NT، يجب أن يكون الحد الأدنى لتكوين جهازك متوافقًا مع 486 وذاكرة تبلغ 20 ميجابايت أو أكثر.
يجب أن يكون لديك جهاز كمبيوتر آخر مثبت عليه متصفح ويب. من أجل جعل الجزء ISAPI من هذه المقالة يعمل بسلاسة، الثاني
يجب أن يكون الجهاز قادرًا على تشغيل جميع البرامج التي تدعم متصفحات الويب. إذا كان جهازك يعمل بنظام التشغيل Windows 95 أو Windows NT
ثم سيتم تشغيل قطعة التعليمات البرمجية WININET في هذه المقالة بشكل أفضل. يمكن استخدام أي متصفح ويب مؤهل في هذه البيئة التقنية.
في إصدارات دلفي 2.0 وما فوق التي صدرت بعد يونيو 1996، توجد الأدوات التي تحتاجها لتوصيل دلفي بالإنترنت.
جميع الموارد تقريبا.
إذا لم يكن لديك أحدث إصدار من دلفي [ملاحظة: يشير المؤلف هنا إلى الإصدار 2.0 (مترجم)]، فأنت بحاجة إلى هذه المقالة
الملفات الخاصة المذكورة في الملف، وجميعها متاحة بشكل شبه مجاني على شبكة الإنترنت العالمية [ملاحظة: إذا كنت تستخدم Delphi2.0 أو أعلى، فلا يسمح لك بالنظر في (مترجم)]. جميع التقنيات المذكورة في هذه المقالة يمكن أن تعمل بسلاسة في بيئة دلفي 2.0، لكنها قد لا تعمل بسلاسة في بيئة دلفي 16 بت.
إذا كنت بحاجة إلى تنزيل معلومات من شبكة الويب العالمية، فالرابط هو: http://www.borland.com/TechInfo/delphi/i
Index.html
[ملاحظة: لم يعد موجودا! :-(((مترجم)]
الإصدار الجديد من Delphi2.0 يأتي مع مستند WININET.PAS إذا كانت نسختك لا تحتوي عليه، فالنسخة المذكورة أعلاه
يمكن لـ World Wide Web Node توفير ذلك لك. يتضمن WININET.PAS قائمة بالمتغيرات والوظائف والأنواع والخصائص المصممة لتوسيع إنترنت Microsoft Windows. وهذا يعني أنه يمكنك بسهولة إضافة دعم FTP وHTTP وGopher إلى تطبيقاتك. يتم توزيع ملف WININET.DLL الخاص بشركة Microsoft مجانًا، إذا لم يكن موجودًا في دليل Windows/System أو Windows/System32، فيمكنك الحصول عليه من Microsoft. فيما يلي عقدة شبكة الويب العالمية حيث يتوفر ملف تعليمات نافذة WININET.H:
http://www.microsoft.com/intdev/sdk/docs/wininet/default.htm [ملاحظة: يبدو أنه لم يعد متاحًا! : -( (مترجم)]
بشكل عام، يعتبر الموقع الإلكتروني لمطوري Microsoft Internet Developers هو الجزء INTDEV من عقدة Microsoft.
بالإضافة إلى WININET وICP، هناك تقنية رئيسية أخرى تدعمها دلفي وهي ISAP. كما هو مذكور في وثائق شركة Microsoft
كما هو موضح، تمكنك هذه التقنية من "كتابة" البرامج النصية من جانب الخادم وتصفية البرامج النصية، وبالتالي توسيع خدمات معلومات الإنترنت لـ Microsoft وخدمات ويب ISAPI الأخرى."
إذا كنت بحاجة إلى العثور على وصف حول ISAPI، يمكنك الانتقال إلى:
http://www.microsoft.com/intdev/sdk/servapi.htm [ملاحظة: بارك الله فيك! ;-) (مترجم)]
في نهاية هذه المقالة، يتم إرفاق نسخة من مستند ISAPI الأساسي المسمى HTTPEXT.PAS.
حزمة التحكم في الإنترنت (ICP) التي تم إصدارها مجانًا بواسطة Microsoft هي مجموعة تحكم OCX/ActiveX التي يمكنك استخدامها في دلفي
قم بسحبها وإسقاطها في التطبيق (يتضمن الإصدار 2.0 من Delphi عناصر التحكم هذه). إنهم يقدمون دعمًا فوريًا لإنشاء تطبيقات دلفي، ويعرفون كيفية تصفح الويب واستخدام FTP وWINSOCK وتقنيات الإنترنت الأخرى. إذا كانت نسختك من دلفي لا تحتوي على عناصر التحكم هذه، فيجب عليك إضافة هذه المستندات إلى دليل Lib في الدليل الذي توجد به دلفي قبل استخدامها. توجد المستندات ضمن موقع INDEX.HTML الخاص ببورلاند على الرابط المذكور أعلاه. لم أذكر ضوابط برنامج المقارنات الدولية في هذه المقالة، ولكن يجب على أي شخص مهتم بهذه التكنولوجيا أن يؤكد بالتأكيد أنه يمتلكها
نسخة من السيطرة.
يمكنك تحميل ملفات تطبيق باسكال الخاصة بي من موقعي، وأسمائها هي STRBOX.PAS و MATHBOX.PAS.
سيكون من المفيد التحقق من هذا الموقع بشكل متكرر للحصول على تحديثات للمعلومات المذكورة في هذه المقالة.
وهنا أفترض أن القارئ على دراية بالدلفي والكائن باسكال، وأن القارئ على دراية بالإنترنت، وHTML،
لديك فهم أساسي للمتصفحات وخوادم الويب العالمية.
ISAPI
ISAPI عبارة عن تقنية سهلة الاستخدام لكنها قوية تسمح لك بتوسيع إمكانيات خدمات معلومات الإنترنت.
تأتي هذه التقنية مع نظام التشغيل Windows NT 4.0 وتسمح لك بإنشاء مواقع WEB وFTP وGOPHER على الخادم الخاص بك. وفي الوقت نفسه، تتوافق هذه التقنية مع WindowsNT3.51 Server [ملاحظة: تشير إلى إصدار الخادم، والإصدار الآخر هو إصدار محطة العمل (مترجم)].
في الماضي، كانت أفضل طريقة لتوسيع نطاق خادم الويب هي إنشاء تطبيقات CGI. إنها أدوات قوية، لكنها كذلك أيضًا
محدودة بتنسيق تنفيذها [ملاحظة: على سبيل المثال، يتم تفسير لغة PERL وتنفيذها (مترجم)]. عندما تقوم بتقديم طلب يستند إلى CGI إلى الخادم من المتصفح، فمن المرجح أن يتم إدخال تطبيق CGI إلى الذاكرة أولاً، الأمر الذي سيستهلك الكثير من الوقت. علاوة على ذلك، في بعض الظروف، يبدو استخدام تقنية CGI أكثر صعوبة قليلاً.
ISAPI هي طريقة لاستبدال تطبيقات CGI عن طريق كتابة ملفات DLL [ملاحظة: برنامج الارتباط الديناميكي (مترجم)]. يمكنك أيضا
من الممكن كتابة نص مفلتر من خلال ISAPI، لكنني لن أذكر هذه التقنية في هذا المقال. بالمقارنة مع CGI، فإن ISAPI أسهل في الاستخدام، وهو أسرع، ويستخدم موارد النظام بشكل أفضل. في النقاط التالية، سأشرح بالتفصيل سبب كون ملفات ISAPI DLLs أفضل من تطبيقات CGI:
توجد ملفات ISAPI DLL في نفس عنوان خدمة HTTP، بحيث يمكنها الوصول إلى خدمة HTTP مباشرة من الخادم. بالمقارنة مع تطبيقات CGI، يمكنها التحميل في الذاكرة بشكل أسرع؛ عندما تقوم بتقديم طلب على الخادم، فإنها تتطلب وقتًا توقفًا أقل [ملاحظة: يشير إلى الوقت بين تقديم الطلب وتلقي الاستجابة من الخادم (مترجم)] كثيرًا. وهذا أكثر أهمية عندما يكون الخادم تحت ضغط كبير.
يمكنك التحكم في وقت تحميل ملفات DLL وإلغاء تحميلها. على سبيل المثال: يمكنك تحميل ملفات DLL مسبقًا عند الطلب الأول
قم بإلغاء تحميل ملفات DLL الخاصة بتطبيق ISAPI عندما لا تكون قيد الاستخدام لتحرير موارد النظام.
كما ذكرنا من قبل، يمكنك استخدام ISAPI لكتابة نص تمت تصفيته [ملاحظة: يشير بشكل عام إلى البرامج النصية في بنية C/S (مترجم)]، المزيد
وفقًا لوثائق Microsoft، يمكنك تصفية النص عبر ISAPI للقيام بما يلي:
نظام ترخيص المستخدم
ضغط
التشفير
تسجيل الدخول
تحليل حركة المرور أو تحليل الطلبات الأخرى (على سبيل المثال، البحث عن الطلبات في "...etcpassWord")
في هذه المقالة، سأركز على كيفية كتابة ملفات DLL التي تُرجع مجموعات البيانات، أو كيفية التفاعل مع المستخدمين الذين يقومون بتشغيل المتصفحات.
إجراء اتصال بسيط.
أساسيات ISAPI
يحتوي الملف HTTPEXT.PAS على عبارات أساسية لاستخدام ISAPI. يجب أن ترافق هذه الوثيقة
تم توزيع نسخة دلفي ويمكن العثور عليه أيضًا على موقع Borland، المرفق بقسم ISAPI في هذه المقالة. ونظرًا لأن هذا يعتمد على تقنية NT، فيجب عليك استخدام Delphi2.0 أو أعلى لتطبيق هذه التقنية. لا يمكنك استخدام هذا على محرر 16 بت.
يحتوي HTTPEXT.PAS على واجهة تقنية ISAPI التي أنشأتها Microsoft [ملاحظة: يشير إلى واجهة دلفي، ويتم تجميع ISAPI في C++
الكتابة (مترجم)]. عند كتابة لغة دلفي، لا تتوفر واجهة مستخدم ISAPI، وسأشرح فقط كيفية استخدام تقنية Microsoft الحالية. ومع ذلك، فإن ISAPI سهل الاستخدام للغاية، وبالنسبة لمعظم المستخدمين، فإن إصدار المستخدم لكائن دلفي ليس ضروريًا.
هناك ثلاث وظائف يمكن استخدامها كمداخل لمكتبات ISAPI DLLs، أول وظيفتين مطلوبة، والثالثة اختيارية.
GetExtensionVersion: تحقق من الحد الأدنى للإصدار
HttpExtensionPRoc: هذه هي نقطة الدخول إلى ملف DLL، تمامًا مثل كتلة البداية...النهاية في تطبيق دلفي
TerminateExtension: هذا برنامج اختياري يمكن استخدامه كمؤشر ترابط لتنظيف عمليات تخصيص الذاكرة الأخرى.
عند إنشاء ملف ISAPI DLL، يجب عليك الرجوع إلى أول وظيفتين من الوظائف الثلاث المذكورة أعلاه، وتنفيذ ذلك
وظيفتان هما المفتاح لجميع برمجة ISAPI.
تحتوي كافة العبارات الثلاثة على "مخرجات الكلمات"، وهو مصطلح يستخدم لأن مكتبات ISAPI DLL تعمل على توسيع خدمات معلومات الإنترنت
جهاز. (تذكر أن Internet Information Server يشير إلى Microsoft Server. إذا كنت تريد استخدام خادم NT كخادم ويب فعلي، فهذه هي بالضبط الأداة التي تحتاجها. يتم توزيع ملفات ISAPI DLL مع NT4.0 ويتم تثبيتها عند تثبيت نظام التشغيل يتم تثبيته تلقائيًا.)
يوفر ISAPI معيارًا يمكن لخوادم الإنتاج اتباعه. على سبيل المثال، يمكن أن تستخدم واجهة NSAPI المعقدة الخاصة بـ Netscape
مضغوط إلى ISAPI المختصرة والجميلة ذات الصلة لتشغيل واجهة NSAPI.
وفيما يلي إعلان هاتين الوظيفتين المهمتين
وظيفة GetExtensionVersion(var Ver: THSE_VERSION_INFO): BOOL;
وظيفة HttpExtensionProc(var ECB: TExtensionControlBlock): DWORD stdcall;
ما عليك سوى لصق GetExtensionVersion في ملفات DLL الخاصة بك وبذلك تكون قد انتهيت من الأمر، ما عليك سوى إجراء تغييرات طفيفة عندما يقوم ISAPI بإصدار إصدارات جديدة للعامة.
وظيفة GetExtensionVersion (إصدار var: THSE_VERSION_INFO):
BOOL;
يبدأ
Ver.dwExtensionVersion := $00010000; // 1.0 الدعم
Ver.lpszExtensionDesc := 'Delphi 2.0 ISAPI DLL';
النتيجة := صحيح؛
نهاية؛
تم تعريف المعلمة التي تم تمريرها إلى هذه الوظيفة في HTTPEXT.PAS كما يلي:
يتم الإعلان عن المعلمات ذات الصلة في HTTPEXT.PAS كما يلي:
PHSE_VERSION_INFO = ^THSE_VERSION_INFO;
THSE_VERSION_INFO = سجل معبأ
dwExtensionVersion: DWORD;
lpszExtensionDesc: الصفيف[0..HseMaxExtDLLNameLen-1] من Char؛
نهاية؛
يحتوي الثابت HseMaxExtDllNameLen على قيمة 256 في الإعلان. المتغيران الموجودان في السجل "تم الإعلان عنهما ذاتيًا". الأول يحتوي على رقم إصدار ISAPI [ملاحظة: المتغير dwExtensionVersion (مترجم)]، ويمثل الأخير سلسلة محددة من قبل المستخدم تستخدم لوصف مكتبات الارتباط الحيوي (DLL).
عند الرجوع إلى عبارة GetExtensionVersion، يجب عليك إضافة إدخال إلى قسم ملف DPR في برنامج DLL الخاص بك.
خارج الجزء. أثناء كتابة هذا البيان، يجب عليك أيضًا أن تكتب:
صادرات
GetExtensionVersion
this.htpExtensionProc;
هذا هو ما تفعله عند إعداد الوظائف لهاتين المكتبتين المهمتين ISAPI DLLs. الخطوة التالية، باستخدام HttpExtensionProc، أكثر تعقيدًا بعض الشيء، لذا سأتركها كقسم منفصل.
العمل مع HttpExtensionProc
عبارة HttpExtensionProc هي نقطة الإدخال لمكتبة الارتباط الحيوي (DLL). وظيفتها تشبه عبارة main() في لغة C، أو
الجزء البداية...النهاية في دلفي
فيما يلي مثال بسيط باستخدام بيان GetExtensionVersion
وظيفة HttpExtensionProc(var ECB: TExtensionControlBlock):
DWORD;
فار
ResStr: سلسلة؛
سترلين: عدد صحيح؛
يبدأ
ECB.lpszLogData := 'سجل دلفي DLL';
ECB.dwHTTPStatusCode := 200;
ResStr := '+
'
"مرحبًا من ISAPI
' +
';
ResStr := التنسيق(
"HTTP/1.0 200 موافق"#13#10+
'نوع المحتوى: نص/html'#13#10+
'طول المحتوى: %d'#13#10+
'المحتوى:'#13#10#13#10'%s'
[الطول (ResStr)
ResStr]);
StrLen := Length(ResStr);
ECB.WriteClient(ECB.ConnID
المؤشر (ResStr)
سترلين
0)؛
النتيجة := HSE_STATUS_SUCCESS;
نهاية؛
إذا قمت بتقديم طلب إلى ملف DLL هذا أثناء التصفح، فسوف تحصل على استجابة مثل هذا:
نتائج خادم الاختبار
مرحبًا من ISAPI
ترتبط معظم الحقول داخل نص الوظيفة ارتباطًا وثيقًا بكود HTML البسيط الذي يوفر المعلومات الأساسية. تحتاج أيضًا إلى ملء بعض الحقول في TExtensionControlBlock كما هو موضح أدناه.
لاحظ وجود مؤشر دالة يسمى WriteClient في هذا السجل. يمكنك الرجوع إلى هذه الوظيفة لتمرير المعلومات
إرسال مرة أخرى إلى المتصفح. عند استدعاء هذه الوظيفة، يمكنك استخدام حقل ConnID في كتلة TExtensionControl المذكورة أدناه. عند استدعاء الوظيفة، يتم ملء ConnID تلقائيًا لك.
قبل النظر إلى رمز الوظيفة، اسمحوا لي أن أوضح لك جميع وظائف HttpExtensionProc المذكورة أعلاه
برنامج كامل من ISAPI DLL
مكتبة Isapi1؛
مكتبة Isapi1؛
الاستخدامات
ويندوز
سيسوتيلس
HTTPExt;
وظيفة GetExtensionVersion( var Ver: THSE_VERSION_INFO ): BOOL;
يبدأ
Ver.dwExtensionVersion := $00010000; // نتوقع دعم الإصدار 1.0
Ver.lpszExtensionDesc := 'مكتوب في دلفي 2.0'؛
النتيجة := صحيح؛
نهاية؛
وظيفة HttpExtensionProc (فار ECB: TEXTENSION_CONTROL_BLOCK ): DWORD؛
com.stdcall;
فار
ResStr: سلسلة؛
سترلين: عدد صحيح؛
يبدأ
ECB.lpszLogData := 'سجل دلفي DLL';
ECB.dwHTTPStatusCode := 200;
ResStr := '
' +
'
نتائج اختبار الخادم
' +
'
Isapi يقول مرحباً لـ DevRel
';
ResStr := التنسيق(
"HTTP/1.0 200 موافق"#13#10+
'نوع المحتوى: نص/html'#13#10+
'طول المحتوى: %d'#13#10+
'المحتوى:'#13#10#13#10'%s'
[الطول (ResStr)
ResStr]);
StrLen := Length(ResStr);
ECB.WriteClient(ECB.ConnID
المؤشر (ResStr)
سترلين
0)؛
النتيجة := HSE_STATUS_SUCCESS;
نهاية؛
صادرات
GetExtensionVersion
this.htpExtensionProc;
يبدأ
نهاية.
من أجل تشغيل برنامج DLL هذا، يجب عليك نسخه إلى دليل البرامج النصية ضمن خادم NT الخاص بك. في جهازي NT4.0
تسير الأمور على هذا النحو:
ج:winntsystem32inetsrvscriptsmystuffisapi1.dll
في هذا المثال قمت بإنشاء الدليل الخاص بي المسمى "mystuff"
يتم استخدامه فقط لتخزين ما قمت بإنشائه
ملفات ISAPI DLL. الدليل الخاص بك، بالطبع، لن يكون هو نفسه تمامًا الموجود على جهازي، اعتمادًا على موقع دليل "inetsrv" الخاص بك وعوامل أخرى.
لاستدعاء ملف DLL هذا بنجاح، يجب عليك إضافة هذا الارتباط التشعبي إلى صفحة HTML الخاصة بك:
ايسابي واحد
عندما يقوم المستخدم بالنقر فوق هذا الارتباط التشعبي، سيتم استدعاء ISAPI1 Dll، ثم سيتم عرض السلسلة "Hello from ISAPI"
المعروضة على متصفح المستخدم. إذا لم تقم بوضع ISAPI.DLL في الدليل mystuff، فيجب عليك تعديل تعليمات HTML البرمجية المذكورة أعلاه لتكييفها مع الموقف لديك. لاحظ أن الدليل الخاص بك يجب أن يكون مرتبطًا بالدليل inetsrv ويجب ألا يحتوي، ولا يمكن أن يحتوي على الدليل الذي يوجد به ملف DLL بأكمله.
فيما يلي نص HTML الكامل للمكالمة:
هذه هي الصفحة الرئيسية لجهاز الكمبيوتر المنزلي الخاص بي.
ايسابي واحد
لاحظ أنه إذا قمت بنسخ البرنامج ISAPI1.DLL إلى دليل mystuff عدة مرات، فيجب عليك القيام بذلك
أغلق منفذ الويب العالمي لخادم الويب. وذلك لأنه في المرة الأولى التي تقوم فيها بنسخ ملف DLL هذا، تكون خاليًا من القيود، ولكن بعد ذلك، فإنه ينتمي إلى الخادم. لذلك، عند نسخ الإصدار المحدث من النسخة الأولى، يجب عليك إيقاف تشغيل خدمة World Wide Web. يمكنك استخدام برنامج إدارة الشبكة لإيقاف تشغيل خدمة World Wide Web. يجب أن يكون هذا البرنامج ضمن مجموعة Microsoft Internet Server ويتم تثبيته ضمن Explorer/Program Manager عند تثبيت خدمات معلومات الشبكة.
يعمل مع TExtensionControlBlock
من خلال هذه النقطة في هذه المقالة، ستتمكن من إنشاء أول ISAPI DLL وتشغيله عبر الإنترنت على جهاز ثانٍ.
متصفح الويب يطلق عليه.
ستكون بقية ISAPI أكثر تفصيلاً في هذه المقالة.
إليك الجزء الأكثر تعقيدًا من معلمات HttpExtensionProc
PExtensionControlBlock = ^TExtensionControlBlock;
TExtensionControlBlock = سجل معبأ
cbSize: DWORD // = sizeof(TExtensionControlBlock)
dwVersion: DWORD؛ // معلومات الإصدار لهذه المواصفات
ConnID: HCONN؛ // لا تقم بتعديل السياق!
dwHttpStatusCode: DWORD // رمز حالة HTTP
// معلومات سجل منتهية خالية خاصة بملحق DLL هذا
lpszLogData: صفيف [0..HSE_LOG_BUFFER_LEN-1] من Char؛
lpszMethod: PChar;
lpszQueryString: PChar;
lpszPathInfo: PChar // PATH_INFO
lpszPathTranslated: PChar // PATH_TRANSLATED
cbTotalBytes: DWORD؛ // إجمالي البايتات من العميل
cbAvailable: DWORD؛ // العدد المتاح من البايتات
lpbData: المؤشر؛ // المؤشر إلى البايتات المتاحة
lpszContentType: PChar; // نوع محتوى بيانات العميل
GetServerVariable: TGetServerVariableProc;
WriteClient: TWriteClientProc;
قراءة العميل: TReadClientProc؛
ServerSupportFunction: TServerSupportFunctionProc;
نهاية؛
لاحظ أن هذا السجل يحتوي على حقل ConnID المذكور أعلاه، ويقوم بتمرير المعلمة الأولى إلى WriteClient.
المعلمة الأولى في هذا السجل مخصصة للتحكم في الإصدار. يجب أن يكون حجم TExtensionControlBlock المحدد. إذا قامت Microsoft بتغيير بنيتها، فيمكنها تحديد إصدار البنية التي تتعامل معها عن طريق التحقق من حجم السجل. لن ترغب أبدًا في الحقول الثلاثة الأولى في هذا السجل، فقد تم ملؤها بالفعل بواسطة ISAPI، ويمكن الوصول إليها فقط، ولا يمكن تغييرها، في برنامجك.
ربما يكون الحقل الأكثر أهمية في هذا السجل هو lpszQueryString، الذي يحتوي على الطلب من الخادم
معلومة. على سبيل المثال، افترض أنك قمت بإنشاء ملف يسمى ISAPI1.Dll. من أجل استدعاء ملف DLL هذا، يمكنك إنشاء HREF مثل هذا [ملاحظة: تنسيق بلغة HTML (مترجم)] على صفحة في متصفحك:
اختبار واحد
إذا كنت تريد الرد على ملف DLL هذا، فأنت بحاجة إلى تغيير السطر أعلاه مثل هذا:
اختبار واحد
إذا كان مقتطف تعليمات HTML البرمجية يحتوي على شيء مثل السطر الثاني من السطرين أعلاه، فستحتوي مكتبة الارتباط الحيوي (DLL) الخاصة بك على المعلمة lpszQueryString
احصل على سلسلة "MyQuery"، وانتبه بشكل خاص لاستخدام علامة الطلب التي تتبع سلسلة الطلب.
بالطبع، يمكنك تغيير سلسلة الطلب كيفما تشاء. على سبيل المثال، يمكنك كتابة:
اختبار واحد
في هذا الطلب، سيرد ملف DLL هذا باسم الخادم. لا تخضع لأية قيود عند تمرير هذه المعلمة. أنت
يمكنك تمرير ما تريد، والأمر متروك لك في كيفية تحليل المعلومات الموجودة في ملف DLL.
عند إرجاع معلومات من الخادم إلى المتصفح، يمكنك استخدام مؤشر الوظيفة "WriteClient" في هذا السجل
. لا يتعين عليك القيام بأي شيء عند تهيئة هذا المؤشر؛ حيث يتم تمريره إليك تلقائيًا بواسطة خادم معلومات الشبكة.
سيلاحظ مؤلفو تطبيقات CGI أن صيغة تمرير سلاسل الطلبات مألوفة جدًا. في الواقع، اتبعت ISAPI CGI
كما هو الحال مع معظم الاتفاقيات، يمكن ببساطة استعارة معظم الحقول في TExtensionControlBlock بواسطة تقنية CGI.
هناك حقل رئيسي آخر في TExtensionControlBlock وهو lpbData، والذي يحتوي على معلومات إضافية تم تحميلها إليك من التصفح.
على سبيل المثال، إذا كان لديك نموذج HTML يحتوي على عدة حقول، فسيتم تسمية المعلومات الموجودة في هذه الحقول "
lpData". الموضوع التالي في هذه المقالة، "الحصول على المعلومات من الزر 'موافق'،" سوف يركز على كيفية التعامل مع هذا الموقف.
لقد قمت حتى الآن بتقديم الحقول الأربعة الرئيسية في TExtensionControlBlock:
WriteClient: مؤشر يسمح لك بتمرير بيانات HTML المنسقة إلى المتصفح. يتم استخدام هذه الوظيفة
حقل ConnID الخاص بـ TExtensionControlBlock.
lpszQueryString: الطلب القادم من المتصفح.
lpbData: بيانات إضافية تم تحميلها إليك من المتصفح. عادةً ما يكون محتوى أي حقل في نموذج HTML
. سأناقش هذا الأمر بشكل أكبر في قسم "زر التأكيد".
للتعرف على كيفية عمل الحقول الأخرى في TExtensionControlBlock، فإن أفضل طريقة هي القيام بذلك
تصفح وقارن بينها. بمعنى آخر، سوف تحتاج إلى إنشاء صفحة HTML تمكن المستخدم من الاتصال بـ ISAPI DLL الخاص بالعميل. الغرض من ISAPI DLL هو ببساطة تنسيق كل حقل في TExtensionControlBlock بتنسيق HTML ثم تمريره مرة أخرى إلى المتصفح. يؤدي هذا إلى تحويل متصفحك إلى مصحح أخطاء مخيف إلى حد ما يعرض كافة الحقول الموجودة في ملف TExtensionControlBlock.
إليك برنامج كتبه داني ثورب من بورلاند، يقوم بهذه المهمة:
اختبار المكتبة 1؛
الاستخدامات
ويندوز
سيسوتيلس
HTTPExt;
وظيفة GetExtensionVersion( var Ver: THSE_VERSION_INFO ): BOOL;
يبدأ
Ver.dwExtensionVersion := $00010000; // 1.0 الدعم
Ver.lpszExtensionDesc := 'اختبار DLL مكتوب في دلفي 2.0'؛
النتيجة := صحيح؛
نهاية؛
وظيفة HttpExtensionProc (فار ECB: TEXTENSION_CONTROL_BLOCK ):
DWORD;
فار
ResStr: سلسلة؛
سترلين: عدد صحيح؛
Buf: صفيف [0..1024] من Char؛
يبدأ
ECB.lpszLogData := 'سجل دلفي DLL';
ECB.dwHTTPStatusCode := 200;
ResStr := التنسيق(
' +
'
'الحجم = %d
'+
'الإصدار = %.8x
'+
'معرف الاتصال = %.8x
'+
'الطريقة = %s
' +
'الاستعلام = %s
' +
'معلومات المسار = %s
'+
'مترجم المسار = %s
'+
'إجمالي البايت = %d
'+
'البايتات المتوفرة = %d
'+
'نوع المحتوى = %s
'+
'
[ECB.cbSize
ECB.dwVersion
ECB.ConnID
ECB.lpszMethod
ECB.lpszQueryString
ECB.lpszPathInfo
ECB.lpszPathTranslated
ECB.cbTotalBytes
ECB.cbمتاح
ECB.lpszContentType]);
مع البنك المركزي الأوروبي القيام به
يبدأ
StrLen := Sizeof(Buf);
GetServerVariable(ConnID
"REMOTE_ADDR"
@ بوف
سترلين)؛
ResStr := ResStr + 'REMOTE_ADDR = '+Buf+'
';
StrLen := SizeOf(Buf);
GetServerVariable(ConnID
"REMOTE_HOST"
@ بوف
سترلين)؛
ResStr := ResStr + 'Remote_Host = '+Buf+'
';
StrLen := SizeOf(Buf);
GetServerVariable(ConnID
"REMOTE_USER"
@ بوف
سترلين)؛
ResStr := ResStr + 'Remote_User = '+Buf+'
';
StrLen := SizeOf(Buf);
GetServerVariable(ConnID
"الخادم_NAME"
@ بوف
سترلين)؛
ResStr := ResStr + 'SERVER_NAME = '+Buf+'
';
StrLen := SizeOf(Buf);
GetServerVariable(ConnID
"SERVER_PORT"
@ بوف
سترلين)؛
ResStr := ResStr + 'SERVER_PORT = '+Buf+'
';
StrLen := SizeOf(Buf);
GetServerVariable(ConnID
"SERVER_PROTOCOL"
@ بوف
سترلين)؛
ResStr := ResStr + 'SERVER_PROTOCOL = '+Buf+'
';
StrLen := SizeOf(Buf);
GetServerVariable(ConnID
"SERVER_SOFTWARE"
@ بوف
سترلين)؛
ResStr := Format('%sSERVER_SOFTWARE = %s
'+
'معرف الموضوع = %.8x
'
[ResStr
بوف
GetCurrentThreadID]);
نهاية؛
ResStr := ResStr + ';
ResStr := التنسيق(
"HTTP/1.0 200 موافق"#13#10+
'نوع المحتوى: نص/html'#13#10+
'طول المحتوى: %d'#13#10+
'المحتوى:'#13#10#13#10'%s'
[الطول (ResStr)
ResStr]);
StrLen := Length(ResStr);
ECB.WriteClient(ECB.ConnID
المؤشر (ResStr)
سترلين
0)؛
النتيجة := HSE_STATUS_SUCCESS;
نهاية؛
com.xports
GetExtensionVersion
this.htpExtensionProc;
egin
نهاية.
لاستدعاء ملف DLL هذا، يجب عليك إنشاء برنامج نصي HRML يتضمن السطر التالي
اختبار واحد
احصل على المعلومات من زر "تأكيد".
عادةً ما تحتوي نماذج HTML التي ترسل لك معلومات على زر تأكيد بداخلها. طالما أن كمية المعلومات أقل من 49 كيلو بايت، يمكنك ذلك
خذ بعين الاعتبار أن يكون الحقل lpbData في TExetensionControlBlock متاحًا. إليك كيف يمكنك ذلك
في معظم الحالات يتم الحصول على المعلومات التي يرسلها المؤشر إلى هذا الحقل:
فار
S: سلسلة؛
يبدأ
…
S := PChar(ECB.lpbData);
…
نهاية؛
إذا كانت المعلومات الواردة من هذا الحقل أكبر من 48 كيلو بايت، فيجب عليك الاتصال بـ ReadClient للحصول على المعلومات المتبقية.
إذا كنت تريد أن تعرف بالضبط ما هي المعلومات المتوفرة في حقل lpbData، فيمكنك استخدام الوظيفتين التاليتين لتمرير البيانات مرة أخرى إلى متصفح الويب الخاص بك:
وظيفة SetUpResString: سلسلة؛
يبدأ
النتيجة :=' +
' +
'
'lpbData = %s' +
';
نهاية؛
وظيفة HttpExtensionProc (فار البنك المركزي الأوروبي: TExtensionControlBlock):
DWORD;
فار
ResStr: سلسلة؛
سترلين: عدد صحيح؛
س
S1: سلسلة؛
يبدأ
ECB.lpszLogData := 'سجل دلفي DLL';
ECB.dwHTTPStatusCode := 200;
ResStr := SetUpResString;
S := PChar(ECB.lpbData);
ResStr := التنسيق(ResStr
[س])؛
StrLen := Length(ResStr);
ECB.WriteClient(ECB.ConnID
المؤشر (ResStr)
سترلين
0)؛
النتيجة := HSE_STATUS_SUCCESS;
نهاية؛
افترض أن لديك بالفعل نموذج HTML مع الكود التالي المرفق:
سينتج عن هذا الرمز نموذجًا به منطقة نصية لإدخال الأرقام وزر "إرسال" يسمى "GetSquare". إذا كان لديك هذا النموذج، فيمكنك أن تتوقع أن يقوم البرنامجان المذكوران أعلاه بإرجاع السلسلة التالية، على افتراض أن المستخدم يدخل الرقم 23 في منطقة النص في النموذج:
lpbData = GetSquare=23&GetSquare=إرسال
من أجل فهم ما يحدث في هذا الوقت، انتبه إلى الجزء الرئيسي من عبارة HTML المقتبسة من الوظيفة أعلاه. هذا الجزء من العبارة موجود على الخادم وينعكس على النحو التالي:
'lpbData = %s' +
إذا قمت بدراسة التعليمات البرمجية الموجودة في الدالة HttpExtensionProc أعلاه، فستجد أنه قبل هذه الجملة مباشرةً، فإنه يستخدم المعلمة %s في عبارة التنسيق بدلاً من القيمة الموجودة في ECB.lpbData. (إذا كنت لا تعرف كيفية عمل تنسيق البيان، يرجى الرجوع إلى وثائق دلفي ذات الصلة) [ملاحظة: في موسوعة برمجة دلفي 2 للمؤلف (دلفي 2)
توجد تعليمات مفصلة في الفصل الثالث "السلاسل والملفات النصية" في Unleashed (مترجم)]
افترض أنه في النموذج الموضح أعلاه، عندما يضغط المستخدم على زر "تأكيد"، فإن القيمة التي تم تمريرها بواسطة lpbData إلى ISAPI DLL هي:
GetSquare=23&GetSquare=إرسال
لإعطائك فكرة واضحة، اسمحوا لي أن أكرر أن المعلومات التي تم إرسالها مرة أخرى إلى المتصفح بواسطة العبارتين أعلاه هي السلسلة التالية، والتي رأيتها بالفعل:
lpbData = GetSquare=23&GetSquare=إرسال
أفضل طريقة لرؤية هذه العملية هي اختبار تشغيل برنامج ISAPI2 المدرج أدناه. يشبه ISAPI2 ISAPI1، ولكنه يتضمن وظيفة HttpExtensionProc الجديدة الموضحة أعلاه، ويتضمن أيضًا وظيفة الأداة المساعدة SetUpResString.
مكتبة Isapi2؛
الاستخدامات
ويندوز
سيسوتيلس
HTTPExt;
وظيفة GetExtensionVersion (إصدار var: THSE_VERSION_INFO):
BOOL;
يبدأ
Ver.dwExtensionVersion := $00010000; // 1.0 الدعم
Ver.lpszExtensionDesc := 'ملف DLL مكتوب في دلفي 2.0'؛
النتيجة:=صحيح؛
نهاية؛
وظيفة SetUpResString: سلسلة؛
يبدأ
النتيجة :=' +
' +
'
'lpbData = %s' +
';
نهاية؛
وظيفة HttpExtensionProc (فار ECB: TEXTENSION_CONTROL_BLOCK ):
DWORD;
فار
ResStr: سلسلة؛
سترلين: عدد صحيح؛
س
S1: سلسلة؛
لين: عدد صحيح؛
يبدأ
ECB.lpszLogData := 'سجل دلفي DLL';
ECB.dwHTTPStatusCode := 200;
ResStr := SetUpResString;
S := PChar(ECB.lpbData);
ResStr := التنسيق(ResStr
[س])؛
StrLen := Length(ResStr);
ECB.WriteClient(ECB.ConnID
المؤشر (ResStr)
سترلين
0)؛
النتيجة := HSE_STATUS_SUCCESS;
نهاية؛
صادرات
GetExtensionVersion
this.htpExtensionProc;
يبدأ
نهاية.
بمجرد حصولك على المعلومات التي تم تمريرها بواسطة المتغير lpbData من النموذج، يمكنك تحليل المعلومات أو إعادتها إلى المستخدم. على سبيل المثال، يمكنك استخراج الرقم 23 من المثال أعلاه، وتربيعه وإعادته إلى المستخدم. يتيح لك القيام بذلك الحصول على معلومات من المستخدم، وهي في هذه الحالة أرقام، وإجراء بعض العمليات الحسابية على الأرقام، وفي النهاية إرجاع النتيجة إلى المستخدم. وهذا يعني أنه يمكنك إنشاء صفحات ويب تفاعلية مباشرة على موجات الأثير، وهو الجانب الأكثر شيوعًا لبرمجة الإنترنت في الوقت الحالي!
فيما يلي رمز برنامج كامل يرسل مربع الرقم إلى المتصفح عبر الشبكة:
مكتبة Isapi3؛
{ يوضح هذا الرمز كيفية تلقي المدخلات من المستخدم عبر المتصفح
تحليل تلك المعلومات
ثم قم بإرجاع الإجابة للمستخدم على وجه الخصوص
يقوم المستخدم بإرسال رقم
هذا الرمز يربعه
ثم يرسل النتيجة مرة أخرى إلى المستخدم. إليك النموذج من المتصفح الذي يرسل المعلومات للتحليل:
}
الاستخدامات
ويندوز
سيسوتيلس
HTTPExt
ستربوكس؛
وظيفة GetExtensionVersion (إصدار var: THSE_VERSION_INFO):
BOOL;
يبدأ
Ver.dwExtensionVersion := $00010000; // دعم الإصدار 1.0
Ver.lpszExtensionDesc := 'ISAPI3.DLL';
النتيجة:=صحيح؛
نهاية؛
// تحليل lpbData واسترجاع الرقم الذي مرره المستخدم إلينا.
وظيفة ParseData(S: سلسلة): عدد صحيح؛
يبدأ
S := StripLastToken(S
'&');
S := StripFirstToken(S
'=');
النتيجة := StrToInt(S);
نهاية؛
وظيفة SetUpResString: سلسلة؛
يبدأ
النتيجة :=' +
' +
'
'الإجابة = %d' +
';
نهاية؛
وظيفة HttpExtensionProc (فار ECB: TEXTENSION_CONTROL_BLOCK ):
DWORD;
فار
ResStr: سلسلة؛
سترلين: عدد صحيح؛
س
S1: سلسلة؛
الرقم: عدد صحيح؛
يبدأ
ECB.lpszLogData := 'سجل دلفي DLL';
ECB.dwHTTPStatusCode := 200;
ResStr := SetUpResString;
S := PChar(ECB.lpbData);
Num := ParseData(S);
الأعداد := Sqr(Num);
ResStr := التنسيق(ResStr
[رقم])؛
StrLen := Length(ResStr);
ECB.WriteClient(ECB.ConnID
المؤشر (ResStr)
سترلين
0)؛
النتيجة := HSE_STATUS_SUCCESS;
نهاية؛
صادرات
GetExtensionVersion
this.htpExtensionProc;
يبدأ
نهاية.
يقبل هذا الرمز السلسلة التالية من المستخدم الذي ضغط على زر التأكيد وطلب الرقم المربع:
GetSquare=5&GetSquare=إرسال
بافتراض إدخال مثل هذا، سيعيد هذا الرمز السلسلة التالية إلى المستخدم عبر الإنترنت:
الجواب = 25
في جملة واحدة، يقوم المستخدم بإدخال الرقم 5، وتقوم أنت بإرجاع الرقم 25 للمستخدم. إذا أرسل المستخدم الرقم 10، فإنك تقوم بإرجاع الرقم 100. قد يبدو هذا تافهاً، لكن ما يهم هنا هو ما يحدث على الإنترنت [ملاحظة: تشير إلى صفحات الويب التفاعلية (مترجمة
من)]
قم بتحليل الوظيفة التي مررها المستخدم مثل هذا:
// تحليل lpbData واسترجاع الرقم الذي مرره المستخدم إلينا.
وظيفة ParseData(S: سلسلة): عدد صحيح؛
يبدأ
S := StripLastToken(S
'&');
S := StripFirstToken(S
'=');
النتيجة := StrToInt(S);
نهاية؛
هذان البيانان موجودان في الوحدة المذكورة في بداية هذه المقالة وموجودان أيضًا على موقعي. [ملاحظة: يمكن العثور على هذه الوثيقة في كل مكان تقريبًا على الإنترنت
يمكنك أيضًا طلبها من المترجم (المترجم)][في هذه المقالة
أريد فقط أن أتحدث عن ISAPI كثيرًا. يجب أن يكون هذا كافيًا لإلهامك للاستمتاع بالاستفادة من هذه التكنولوجيا الرائعة. بعد ذلك أريد أن أتحدث عن البيانين GetServerVariable وReadClient، لقد أجريت تجارب محدودة للغاية في هذا الصدد. في هذه المقالة، قمت بإرفاق ملف HTTPEXT.PAS لأنك لن تجده في أي مكان آخر غير هذا المستند المهم.
بيانات GetServerVariable وReadClient
تمامًا مثل طلب المعلومات في تطبيق CGI الخاص بك، يمكنك استخدام البيانات للحصول على معلومات من الخادم. فيما يلي مثال على استدعاء هذا البيان:
Len := HseMaxExtDllNameLen;
تعيين الطول (S1
لين)؛
ديسمبر (لين)؛
ECB.GetServerVariable(ECB.ConnID
"CONTENT_LENGTH"
بيشار(S1)
لين)؛
أولاً، يقوم هذا الكود بتعيين طول المخزن المؤقت الذي يحتوي على المعلومات المستردة من الخادم. ثم يتصل بالخادم ويقدم طلبًا، وفي هذه الحالة يطلب "CONTENT_LENGTH" للرسالة من الخادم.
تخبرنا وثائق Microsoft أنه يمكنك تمرير السلسلة التالية كمعلمة ثانية لـ GetServerVariable:
AUTH_TYPE يحتوي على نوع التفويض المستخدم. على سبيل المثال، إذا كنت تستخدم التفويض الأساسي، إذن
السلسلة "أساسية"؛ إذا كانت استجابة ارتياب NT، تكون السلسلة "NTLM". التراخيص الأخرى لها سلاسل مقابلة محددة. نظرًا لأنه تتم إضافة أنواع التفويض الجديدة باستمرار إلى الخادم، فليس من الممكن إدراج جميع السلاسل الممكنة. إذا كانت السلسلة فارغة، فلن يتم استخدام أي ترخيص.
CONTENT_LENGTH عدد البايتات التي يتوقع البرنامج النصي استعادتها من العميل.
CONTENT_TYPE نوع محتوى المعلومات التي يقدمها نص إعلان الطلب. [ملاحظة: الأخ الأصغر أقل موهبة وأقل علماً، أ
تمت ترجمة طلب POST مؤقتًا إلى "إشعار الطلب"، يرجى تصحيحي (مترجم)]
PATH_INFO معلومات التوجيه الإضافية المقدمة من قبل العميل. يحتوي على المسار إلى عنوان URL الذي يتبع اسم البرنامج النصي
تعتمد على. في حالة وجوده ، يسبق سلسلة الطلب.
path_translated هذه هي قيمة path_info ولكنها تحتوي على أسماء جميع الطرق الافتراضية التي تم توسيعها إلى علامة مسار.
Query_String المعلومات التالية "؟"
remote_addr عنوان IP الخاص بالعميل طلب أو وكيله (على سبيل المثال ، بوابة أو جدار حماية).
Remote_host اسم المضيف للعميل طلب أو وكيله (على سبيل المثال ، بوابة أو جدار حماية).
REMOTE_USER هذا يحتوي على اسم المستخدم الذي يوفره العميل والمصرح به من قبل الخادم. إذا تم إرجاع سلسلة فارغة ثم المستخدم
باسمك (ولكن مع إذن).
unmped_remote_user إنه اسم مستخدم له الخصائص التالية: يقدم هذا المستخدم طلبًا إلى حساب مستخدم NT (هذا هو هويته) ، قبل أن يقوم مرشح تطبيق ISAPI بتعيين المستخدم.
request_method هي طريقة طلب HTTP.
Script_name اسم البرنامج النصي الذي تم تنفيذه.
Server_name اسم المضيف أو عنوان IP عندما يظهر في عناوين URL المرجعية الذاتية.
Server_port منفذ TCP/IP الذي يقبل الطلبات.
Server_port_secure سلسلة إما 0 أو 1. هو 1 عندما يتم التعامل مع الطلب من قبل منفذ آمن.
يقبل Server_protocol اسم وإصدار معلومات البروتوكول المرتبطة بهذا الطلب. وعادة ما يكون HTTP/1.0.
Server_software هو اسم وإصدار خادم الويب حيث يعمل برنامج DLL Application Application. All_http لم يتغير المتغير السابق جميع رؤوس HTTP. يتم اشتقاق هذه المتغيرات من http_ <اسم رأس الحقل>. تحتوي رؤوس الحقل (مفصولة بواسطة علامات الخط) على سلاسل فردية ، والتي لم يتم إنهاءها.
http_accept حالة خاصة من رأس حقل HTTP. القيم المقبولة هي: الحقول مفصولة بفواصل (،). على سبيل المثال: إذا
الأسطر التالية هي جزء من رأس HTTP:
قبول: */ *، س = 0.1
ثم يعطي عنوان URL (ميزة جديدة في الإصدار 2.0) الجزء الأساسي.
لاحظ أن قطعة المعلومات الواردة أعلاه يتم تمريرها تلقائيًا بواسطة سجل TextensionControlBlock. لأن
لا تحتاج إلى استدعاء GetServerVariable لهذا. ومع ذلك ، يمكنك الاتصال به إذا كنت في حاجة إليها حقًا ، خاصة إذا كنت ترغب في الحصول على معلومات من ReadClient وتحتاج إلى معرفة مقدار المعلومات التي يجب قراءتها.
في كثير من الأحيان ، لا تحتاج إلى استدعاء ReadClient. ومع ذلك ، فإن حجم الرسالة التي يرسلها متصفحك أكبر من 48 كيلو بايت
الوقت ، تحتاج إلى الاتصال ReadClient للحصول على بقية المعلومات.