Artikel ini terutama menjelaskan cara membuat DELPHI dan Internet bekerja sama. Dua teknologi khusus akan dijelaskan secara rinci dalam artikel ini:
WININET: Membangun program klien FTP, HTTP dan Gopher ISAPI: Memperluas layanan informasi Internet, misalnya memperoleh informasi di server dan menampilkannya di browser.
Di dunia komputer saat ini, tren perkembangan yang besar telah dipicu oleh strategi Internet Microsoft. pembuatan itu
Hari-hari CGI (Common Gateway Interface) dan alat pihak ketiga bahkan untuk alat Internet paling dasar pun akhirnya lenyap. Akan selalu ada kebutuhan akan alat pihak ketiga yang canggih, namun kini pemrogram akan menemukan beragam alat Internet yang mereka butuhkan yang tertanam dalam sistem operasi. Singkatnya, tanpa investasi lebih lanjut, Anda dapat menggunakan sumber daya DELPHI gratis untuk:
*Kembangkan peramban WEB
*Jalankan FTP, HTTP dan Gopher antara dua aplikasi DELPHI atau aplikasi DELPHI dan TCP
(Transmission Control Protocol) mengoperasikan TCP antar server
Karena DELPHI dapat dengan mudah memanggil Windows API dan mendukung OCX/ActiveX, strategi baru Microsoft
Strateginya sangat sesuai dengan rencana kami. Microsoft memproduksi alat, dan pemrogram DELPHI menuai hasilnya!
Apa isi artikel ini?
Artikel ini memuat tiga bagian besar dan beberapa bagian kecil, dengan tiga tema besar:
*Temukan Materinya: Dokumentasi teknis yang disebutkan dalam artikel ini tersedia di sana dan mencakup penjelasan singkat tentang perangkat keras dan perangkat lunak yang Anda perlukan untuk menjalankan kode dalam artikel ini.
*ISAPI: Cara menggunakan ISAPI
*WININET: Cara menggunakan WININET
Dalam kebanyakan kasus, bagian ISAPI dan WININET dalam artikel ini sepenuhnya independen, dan Anda bebas memilih urutan pembacaannya.
Temukan informasi, kebutuhan perangkat keras dan perangkat lunak
Anda memerlukan salinan Microsoft Windows NT 3.51 Server atau NT 4.0 Server, yang harus disertai dengan dokumentasi Layanan Informasi Internet, karena Anda perlu memahami teknologi yang disebutkan di dalamnya. Dokumen ini harus disertakan dengan NT Server4.0, dan pengguna NT 3.51 dapat mendownloadnya dari situs web Microsoft. Untuk menjalankan Windows NT, konfigurasi minimum mesin Anda harus kompatibel dengan 486 dan memori 20 MB atau lebih.
Anda harus memiliki komputer lain dengan browser web terpasang. Agar bagian ISAPI artikel ini berjalan lancar, yang kedua
Mesin harus mampu menjalankan semua perangkat lunak yang mendukung browser web. Jika mesin Anda menjalankan Windows 95 atau Windows NT
Maka potongan kode WININET dalam artikel ini akan berjalan dengan baik. Browser web apa pun yang memenuhi syarat dapat digunakan dalam lingkungan teknis ini.
Dalam versi Delphi 2.0 ke atas yang dirilis setelah Juni 1996, terdapat alat yang Anda perlukan untuk menghubungkan Delphi ke Internet.
hampir semua sumber daya.
Jika Anda belum memiliki Delphi versi terbaru [Catatan: Penulis di sini mengacu pada versi 2.0 (penerjemah)], maka Anda memerlukan artikel ini
File khusus yang disebutkan dalam file, semuanya tersedia hampir gratis di World Wide Web [Catatan: Jika Anda menggunakan Delphi2.0 atau lebih tinggi, Anda tidak diperbolehkan untuk mempertimbangkannya (Penerjemah)]. Semua teknik yang disebutkan dalam artikel ini dapat bekerja dengan lancar di lingkungan Delphi2.0, namun mungkin tidak bekerja dengan lancar di lingkungan Delphi 16-bit.
Jika Anda perlu mengunduh informasi dari World Wide Web, tautannya adalah: http://www.borland.com/TechInfo/delphi/i
indeks.html
[Catatan: Itu sudah tidak ada lagi! :-(( (Penerjemah)]
Versi baru Delphi2.0 dilengkapi dengan dokumen WININET.PAS. Jika salinan Anda tidak memuatnya, maka yang di atas
World Wide Web Node dapat menyediakan ini untuk Anda. WININET.PAS menyertakan daftar variabel, fungsi, tipe, dan properti yang dirancang untuk memperluas Microsoft Windows Internet. Ini berarti Anda dapat dengan mudah menambahkan dukungan FTP, HTTP dan Gopher ke aplikasi Anda. WININET.DLL Microsoft didistribusikan secara gratis. Jika tidak ada di direktori Windows/System atau Windows/System32, Anda bisa mendapatkannya dari Microsoft. Berikut adalah node World Wide Web tempat file bantuan jendela WININET.H tersedia:
http://www.microsoft.com/intdev/sdk/docs/wininet/default.htm [Catatan: Tampaknya sudah tidak tersedia lagi! : -( (Penerjemah)]
Secara umum, beranda online untuk Microsoft Internet Developers adalah bagian INTDEV dari node Microsoft.
Selain WININET dan ICP, teknologi kunci lain yang didukung oleh Delphi adalah ISAP. Sebagaimana dinyatakan dalam dokumentasi perusahaan Microsoft
Seperti dijelaskan, teknologi ini memungkinkan Anda untuk "'menulis' skrip sisi server dan memfilter skrip, sehingga memperluas Layanan Informasi Internet Microsoft dan layanan Web ISAPI lainnya."
Jika Anda perlu mencari penjelasan tentang ISAPI, Anda dapat mengunjungi:
http://www.microsoft.com/intdev/sdk/servapi.htm [Catatan: Tuhan memberkati Anda! ;-) (Penerjemah)]
Di akhir artikel ini, salinan dokumen kunci ISAPI bernama HTTPEXT.PAS dilampirkan.
Internet Control Pack (ICP) yang dirilis secara gratis oleh Microsoft adalah set kontrol OCX/ActiveX yang dapat Anda gunakan di Delphi
Tarik dan lepaskan ke dalam aplikasi (Delphi 2.0 menyertakan kontrol ini). Mereka memberikan dukungan langsung untuk membuat aplikasi Delphi, dan mereka tahu cara menjelajahi web, menggunakan FTP, WINSOCK, dan teknologi Internet lainnya. Jika salinan Delphi Anda tidak berisi kontrol-kontrol ini, Anda harus menambahkan dokumen-dokumen ini ke direktori Lib di direktori tempat Delphi berada sebelum menggunakannya. Dokumen-dokumen tersebut terletak di situs INDEX.HTML Borland pada tautan yang disebutkan di atas. Saya belum menyebutkan kontrol ICP dalam artikel ini, tetapi siapa pun yang tertarik dengan teknologi ini harus memastikan bahwa ia memilikinya
Salinan kontrol.
Anda dapat mendownload file aplikasi Pascal saya dari situs saya, namanya STRBOX.PAS dan MATHBOX.PAS.
Akan bermanfaat untuk sering memeriksa situs ini untuk mengetahui pembaruan informasi yang disebutkan dalam artikel ini.
Di sini saya berasumsi bahwa pembaca sudah familiar dengan Delphi dan Object Pascal, dan pembaca sudah familiar dengan Internet, HTML,
Memiliki pemahaman dasar tentang browser dan server World Wide Web.
ISAPI
ISAPI adalah teknologi yang mudah digunakan namun kuat yang memungkinkan Anda memperluas kemampuan layanan informasi Internet.
Teknologi ini hadir dengan Windows NT 4.0 dan memungkinkan Anda membuat situs WEB, FTP dan GOPHER di server Anda. Pada saat yang sama, teknologi ini kompatibel dengan Server WindowsNT3.51 [Catatan: mengacu pada versi server, versi lainnya adalah versi workstation (penerjemah)].
Di masa lalu, cara terbaik untuk menskalakan server web adalah dengan membangun aplikasi CGI. Mereka adalah alat yang ampuh, tetapi mereka juga merupakan alat yang ampuh
Dibatasi oleh format eksekusinya [Catatan: Misalnya, PERL ditafsirkan dan dijalankan (penerjemah)]. Saat Anda membuat permintaan berbasis CGI ke server dari browser, kemungkinan besar aplikasi CGI akan dipaksa masuk ke memori terlebih dahulu, yang akan memakan banyak waktu. Terlebih lagi, dalam beberapa keadaan, teknologi CGI nampaknya sedikit lebih sulit untuk digunakan.
ISAPI adalah metode penggantian aplikasi CGI dengan menulis DLL [Catatan: Dynamic Link Program (Translator)]. Anda juga bisa
Dimungkinkan untuk menulis teks yang difilter melalui ISAPI, tetapi saya tidak akan menyebutkan teknologi ini di artikel ini. Dibandingkan dengan CGI, ISAPI lebih mudah digunakan, lebih cepat, dan memanfaatkan sumber daya sistem dengan lebih baik. Pada poin berikut ini saya akan menjelaskan secara detail mengapa ISAPI DLL lebih baik dibandingkan aplikasi CGI:
DLL ISAPI terletak di alamat yang sama dengan layanan HTTP, sehingga dapat mengakses layanan HTTP langsung dari server. Dibandingkan dengan aplikasi CGI, mereka dapat memuat ke dalam memori lebih cepat; ketika mereka membuat permintaan di server, mereka memerlukan waktu jeda yang lebih sedikit [Catatan: mengacu pada waktu antara membuat permintaan dan menerima respons dari server (Penerjemah)] Banyak. Ini bahkan lebih penting ketika server sedang mengalami beban berat.
Anda dapat mengontrol kapan DLL dimuat dan dibongkar. Misalnya: Anda dapat melakukan pramuat DLL pada permintaan pertama kapan
Bongkar DLL aplikasi ISAPI saat tidak digunakan untuk mengosongkan sumber daya sistem.
Seperti disebutkan sebelumnya, Anda dapat menggunakan ISAPI untuk menulis teks yang difilter [Catatan: umumnya mengacu pada skrip dalam struktur C/S (penerjemah)], lebih lanjut
Menurut dokumentasi Microsoft, Anda dapat memfilter teks melalui ISAPI untuk melakukan hal berikut:
Skema otorisasi pengguna
kompresi
enkripsi
login
Analisis lalu lintas atau analisis permintaan lainnya (misalnya mencari permintaan di "....etcpassWord")
Pada artikel ini, saya akan fokus pada cara menulis DLL yang mengembalikan kumpulan data, atau cara berinteraksi dengan pengguna yang menjalankan browser.
Buat kontak sederhana.
Dasar-Dasar ISAPI
File HTTPEXT.PAS berisi pernyataan kunci untuk menggunakan ISAPI. Dokumen ini harus menyertai
Versi Delphi didistribusikan. Hal ini juga dapat ditemukan di situs Borland, yang terlampir pada bagian ISAPI artikel ini. Karena ini berbasis teknologi NT, Anda harus menggunakan Delphi2.0 atau lebih tinggi untuk menerapkan teknologi ini. Anda tidak dapat menggunakan ini pada editor 16-bit.
HTTPEXT.PAS berisi antarmuka teknologi ISAPI yang dibuat oleh Microsoft [Catatan: mengacu pada antarmuka Delphi, ISAPI dikompilasi dalam C++
menulis (penerjemah)]. Saat menulis Delphi, tidak ada antarmuka pengguna ISAPI yang disediakan. Saya hanya akan menjelaskan cara menggunakan teknologi yang ada dari Microsoft. Namun, ISAPI terlalu mudah digunakan, dan bagi sebagian besar pengguna, objek Delphi versi pengguna tidak diperlukan.
Ada tiga fungsi yang dapat digunakan sebagai pintu masuk ke ISAPI DLL. Dua fungsi pertama bersifat wajib, dan fungsi ketiga bersifat opsional.
GetExtensionVersion: Periksa versi minimum
HttpExtensionPROc: Ini adalah titik masuk DLL, sama seperti blok awal...akhir dalam aplikasi Delphi
TerminateExtension: Ini adalah program opsional yang dapat digunakan sebagai thread untuk membersihkan alokasi memori lainnya.
Saat Anda membuat DLL ISAPI, Anda harus mereferensikan dua fungsi pertama dari tiga fungsi yang tercantum di atas, jalankan ini
Dua fungsi adalah kunci dari semua pemrograman ISAPI.
Ketiga pernyataan tersebut mengandung "keluaran kata", sebuah istilah yang digunakan karena DLL ISAPI memperluas Layanan Informasi Internet
perangkat. (Ingat, Server Informasi Internet mengacu pada Microsoft Server. Jika Anda ingin menggunakan server NT sebagai server web fisik, maka inilah alat yang Anda perlukan. DLL ISAPI didistribusikan dengan NT4.0 dan diinstal saat menginstal sistem operasi . diinstal secara otomatis.)
ISAPI memberikan standar yang dapat diikuti oleh server produksi. Misalnya, antarmuka NSAPI Netscape yang kompleks
Dikompresi menjadi ISAPI yang relevan, ringkas dan indah untuk mengoperasikan antarmuka NSAPI.
Berikut pencanangan kedua fungsi penting tersebut
fungsi GetExtensionVersion(var Ver: THSE_VERSION_INFO): BOOL;
fungsi HttpExtensionProc(var ECB: TExtensionControlBlock): DWORD;
Anda cukup menempelkan GetExtensionVersion ke DLL Anda dan selesai. Anda hanya perlu melakukan sedikit perubahan saat ISAPI merilis versi baru ke publik.
fungsi GetExtensionVersion(var Ver: THSE_VERSION_INFO):
BOOL;
mulai
Ver.dwExtensionVersion := $00010000; // 1.0 dukungan
Ver.lpszExtensionDesc := 'Delphi 2.0 ISAPI DLL'; // Deskripsi
Hasil := Benar;
akhir;
Parameter yang diteruskan ke fungsi ini dideklarasikan di HTTPEXT.PAS sebagai berikut:
Parameter yang relevan dideklarasikan di HTTPEXT.PAS sebagai berikut:
PHSE_VERSION_INFO = ^THSE_VERSION_INFO;
THSE_VERSION_INFO = catatan yang dikemas
dwVersi Ekstensi: DWORD;
lpszExtensionDesc: array[0..HseMaxExtDLLNameLen-1] dari Char;
akhir;
Konstanta HseMaxExtDllNameLen memiliki nilai 256 dalam deklarasi. Dua variabel dalam catatan adalah "dideklarasikan sendiri". Yang pertama berisi nomor versi ISAPI [Catatan: variabel dwExtensionVersion (Penerjemah)], dan yang terakhir mewakili string yang ditentukan pengguna yang digunakan untuk mendeskripsikan DLL.
Saat Anda mereferensikan pernyataan GetExtensionVersion, Anda harus menambahkan input ke bagian file DPR dari program DLL Anda.
bagian keluar. Saat Anda menulis pernyataan ini, Anda juga harus menulis:
ekspor
Dapatkan Versi Ekstensi
HttpExtensionProc;
Inilah yang Anda lakukan saat menyiapkan fungsi untuk dua DLL ISAPI penting ini. Langkah selanjutnya, menggunakan HttpExtensionProc, sedikit lebih rumit, jadi saya akan membiarkannya sebagai bagian terpisah.
Bekerja dengan HttpExtensionProc
Pernyataan HttpExtensionProc adalah titik masuk DLL. Fungsinya seperti pernyataan main() dalam bahasa C, atau
Bagian awal...akhir di Delphi
Berikut adalah contoh sederhana menggunakan pernyataan GetExtensionVersion
fungsi HttpExtensionProc(var ECB: TExtensionControlBlock):
DWORD;
var
ResStr: string;
StrLen: Integer;
mulai
ECB.lpszLogData := 'Log DLL Delphi';
ECB.dwHTTPStatusCode := 200;
ResStr := ' +
'
'Halo dari ISAPI
' +
';
ResStr := Format(
'HTTP/1.0 200 Oke'#13#10+
'Tipe Konten: teks/html'#13#10+
'Panjang Konten: %d'#13#10+
'Isi:'#13#10#13#10'%s'
[Panjang(ResStr)
ResStr]);
StrLen := Panjang(ResStr);
ECB.WriteClient(ECB.ConnID
Penunjuk(ResStr)
StrLen
0);
Hasil := HSE_STATUS_SUCCESS;
akhir;
Jika Anda membuat permintaan ke DLL ini saat browsing, Anda akan mendapat respon seperti ini:
Hasil Uji Server
Halo dari ISAPI
Sebagian besar bidang dalam badan fungsi terkait erat dengan kode HTML sederhana yang menyediakan informasi dasar. Anda juga perlu mengisi beberapa kolom di TExtensionControlBlock seperti yang ditunjukkan di bawah ini.
Perhatikan bahwa ada penunjuk fungsi bernama WriteClient dalam catatan ini. Anda dapat merujuk ke fungsi ini untuk menyampaikan informasi
Kirim kembali ke browser. Saat memanggil fungsi ini, Anda menggunakan bidang ConnID di blok TExtensionControl yang disebutkan di bawah. Saat fungsi tersebut dipanggil, ConnID secara otomatis diisi untuk Anda.
Sebelum melihat kode fungsinya, izinkan saya mendemonstrasikan untuk Anda semua fungsi HttpExtensionProc yang disebutkan di atas
Program lengkap ISAPI DLL
perpustakaan Isapi1;
perpustakaan Isapi1;
kegunaan
jendela
SysUtils
HTTPEkst;
fungsi GetExtensionVersion( var Ver: THSE_VERSION_INFO ): BOOL;
mulai
Ver.dwExtensionVersion := $00010000; // Kami mengharapkan dukungan versi 1.0
Ver.lpszExtensionDesc := 'Ditulis dalam Delphi 2.0';
Hasil := Benar;
akhir;
fungsi HttpExtensionProc( var ECB: TEXTENSION_CONTROL_BLOCK ): DWORD;
panggilan std;
var
ResStr: string;
StrLen: Integer;
mulai
ECB.lpszLogData := 'Log DLL Delphi';
ECB.dwHTTPStatusCode := 200;
ResStr := '
' +
'
Hasil uji server
' +
'
Isapi menyapa DevRel
';
ResStr := Format(
'HTTP/1.0 200 Oke'#13#10+
'Tipe Konten: teks/html'#13#10+
'Panjang Konten: %d'#13#10+
'Isi:'#13#10#13#10'%s'
[Panjang(ResStr)
ResStr]);
StrLen := Panjang(ResStr);
ECB.WriteClient(ECB.ConnID
Penunjuk(ResStr)
StrLen
0);
Hasil := HSE_STATUS_SUCCESS;
akhir;
ekspor
Dapatkan Versi Ekstensi
HttpExtensionProc;
mulai
akhir.
Untuk menjalankan program DLL ini, Anda harus menyalinnya ke direktori skrip di server NT Anda. Di mesin NT4.0 saya
Bunyinya seperti ini:
c:winntsystem32inetsrvscriptsmystuffisapi1.dll
Dalam contoh ini saya telah membuat direktori bernama "mystuff"
Itu hanya digunakan untuk menyimpan apa yang saya buat
DLL ISAPI. Direktori Anda, tentu saja, tidak akan sama persis dengan yang ada di mesin saya, tergantung pada lokasi direktori "inetsrv" Anda dan faktor lainnya.
Agar berhasil memanggil DLL ini, Anda harus menambahkan hyperlink ini ke halaman HTML Anda:
ISAPI Satu
Ketika pengguna mengklik hyperlink ini, Dll ISAPI1 akan dipanggil, dan kemudian string "Halo dari ISAPI" akan ditampilkan
ditampilkan di browser pengguna. Jika Anda tidak menempatkan ISAPI.DLL di direktori mystuff, maka Anda harus memodifikasi kode HTML di atas untuk menyesuaikannya dengan situasi Anda. Perhatikan bahwa direktori Anda harus relatif terhadap direktori inetsrv dan tidak boleh, dan tidak boleh, berisi direktori tempat seluruh DLL Anda berada.
Berikut ini skrip HTML lengkap dari panggilan tersebut:
Ini adalah halaman beranda untuk komputer di rumah saya.
ISAPI Satu
Perhatikan bahwa jika Anda menyalin program ISAPI1.DLL ke direktori mystuff beberapa kali, Anda harus melakukannya
Tutup port World Wide Web server web. Pasalnya, pertama kali Anda menyalin DLL ini, Anda bebas dari batasan, tetapi setelah itu menjadi milik server. Oleh karena itu, ketika Anda menyalin versi terbaru dari salinan pertama, Anda harus mematikan layanan World Wide Web. Anda dapat menggunakan program manajemen jaringan untuk mematikan layanan World Wide Web. Program ini harus berada di bawah grup Microsoft Internet Server dan diinstal di bawah Explorer/Program Manager ketika menginstal Layanan Informasi Jaringan.
Bekerja dengan TExtensionControlBlock
Dengan poin ini di artikel ini, Anda akan dapat membuat DLL ISAPI pertama Anda dan menjalankannya secara online di mesin kedua.
Browser web menyebutnya.
ISAPI lainnya akan dibahas lebih mendalam di artikel ini.
Inilah bagian yang lebih rumit dari parameter HttpExtensionProc
PExtensionControlBlock = ^TExtensionControlBlock;
TExtensionControlBlock = catatan yang dikemas
cbUkuran: DWORD; // = ukuran(TExtensionControlBlock)
dwVersion: DWORD; // info versi spesifikasi ini
ConnID: HCONN; // Konteks Jangan diubah!
dwHttpStatusCode: DWORD; // Kode Status HTTP
// null menghentikan info log khusus untuk DLL Ekstensi ini
lpszLogData: larik [0..HSE_LOG_BUFFER_LEN-1] dari Char;
lpszMetode: PChar; // REQUEST_METHOD
lpszQueryString: PChar; // QUERY_STRING
lpszPathInfo: PChar; // PATH_INFO
lpszPathDiterjemahkan: PChar; // PATH_TRANSLATED
cbTotalBytes: DWORD; // Total byte dari klien
cbTersedia: DWORD; // Jumlah byte yang tersedia
lpbData: Penunjuk; // penunjuk ke cbByte yang tersedia
lpszContentType: PChar; // Tipe konten data klien
GetServerVariable: TGetServerVariableProc;
Klien Tulis: TWriteClientProc;
Klien Baca: TReadClientProc;
Fungsi Dukungan Server: TServerSupportFunctionProc;
akhir;
Perhatikan bahwa catatan ini berisi bidang ConnID yang disebutkan di atas, dan meneruskan parameter pertama ke WriteClient.
Parameter pertama dalam catatan ini adalah untuk kontrol versi. Ini harus menjadi ukuran TExtensionControlBlock yang ditentukan. Jika Microsoft mengubah strukturnya, mereka dapat menentukan versi struktur mana yang mereka hadapi dengan memeriksa ukuran rekaman. Anda tidak ingin tiga bidang pertama dalam catatan ini, bidang tersebut telah diisi oleh ISAPI, dan bidang tersebut hanya dapat diakses, tidak diubah, di program Anda.
Mungkin kolom terpenting dalam catatan ini adalah lpszQueryString, yang berisi permintaan dari server
informasi. Misalnya, asumsikan Anda telah membuat file bernama ISAPI1.Dll. Untuk memanggil DLL ini, Anda membuat HREF seperti ini [Catatan: format dalam bahasa HTML (penerjemah)] pada halaman di browser Anda:
Tes Satu
Jika Anda ingin merespons DLL ini, Anda perlu mengubah baris di atas seperti ini:
Tes Satu
Jika cuplikan kode HTML berisi sesuatu seperti baris kedua dari dua baris di atas, maka DLL Anda akan memiliki parameter lpszQueryString
Dapatkan string "MyQuery", berikan perhatian khusus pada penggunaan tanda permintaan yang mengikuti string permintaan.
Tentu saja, Anda dapat mengubah string permintaan sesuka Anda. Misalnya, Anda dapat menulis:
Tes Satu
Dalam permintaan ini, DLL ini akan membalas dengan nama server. Anda tidak tunduk pada batasan apa pun saat meneruskan parameter ini. Anda
Anda dapat meneruskan apa pun yang Anda inginkan, dan terserah Anda bagaimana Anda ingin menganalisis informasi di DLL.
Saat Anda mengembalikan informasi dari server ke browser, Anda menggunakan penunjuk fungsi "WriteClient" dalam catatan ini
. Anda tidak perlu melakukan apa pun saat menginisialisasi penunjuk ini; penunjuk ini secara otomatis diteruskan kepada Anda oleh server informasi jaringan.
Penulis aplikasi CGI akan mencatat bahwa sintaks untuk meneruskan string permintaan sangat familiar. Faktanya, ISAPI mengikuti CGI
Seperti kebanyakan konvensi, sebagian besar bidang di TExtensionControlBlock dapat dipinjam dengan teknologi CGI.
Bidang kunci lainnya di TExtensionControlBlock adalah lpbData, yang berisi informasi tambahan yang Anda unggah dari penjelajahan.
Misalnya, jika Anda memiliki formulir HTML dengan beberapa bidang, informasi yang terdapat dalam bidang ini akan disebut "
lpData". Topik berikutnya dalam artikel ini, "Mendapatkan informasi dari tombol 'OK'," akan berfokus pada cara menangani situasi ini.
Sejauh ini saya telah memperkenalkan empat bidang utama di TExtensionControlBlock:
WriteClient: Sebuah pointer yang memungkinkan Anda meneruskan data HTML yang diformat ke browser. Fungsi ini digunakan
Bidang ConnID dari TExtensionControlBlock.
lpszQueryString: Permintaan yang datang dari browser.
lpbData: Data tambahan yang diunggah ke Anda dari browser. Biasanya isi field apapun dalam bentuk HTML
. Saya akan membahasnya lebih lanjut di bagian "Tombol Konfirmasi".
Untuk memahami cara kerja bidang lain di TExtensionControlBlock, cara terbaik adalah melakukannya
Jelajahi dan bandingkan. Dengan kata lain, Anda ingin membuat halaman HTML yang memungkinkan pengguna memanggil ISAPI DLL klien. Tujuan dari DLL ISAPI ini hanyalah untuk memformat setiap bidang di TExtensionControlBlock dalam HTML dan kemudian meneruskannya kembali ke browser. Ini mengubah browser Anda menjadi debugger yang agak menakutkan yang menampilkan semua bidang di TExtensionControlBlock.
Berikut adalah program yang ditulis oleh Danny Thorpe dari Borland yang melakukan tugas ini:
tes perpustakaan1;
kegunaan
jendela
SysUtils
HTTPEkst;
fungsi GetExtensionVersion( var Ver: THSE_VERSION_INFO ): BOOL;
mulai
Ver.dwExtensionVersion := $00010000; // 1.0 dukungan
Ver.lpszExtensionDesc := 'DLL pengujian yang ditulis dalam Delphi 2.0';
Hasil := Benar;
akhir;
fungsi HttpExtensionProc( var ECB: TEXTENSION_CONTROL_BLOCK ):
DWORD;
var
ResStr: string;
StrLen: Integer;
Buf: array [0..1024] dari Char;
mulai
ECB.lpszLogData := 'Log DLL Delphi';
ECB.dwHTTPStatusCode := 200;
ResStr := Format(
' +
'
'Ukuran = %d
'+
'Versi = %.8x
'+
'ID Sambungan = %.8x
'+
'Metode = %s
' +
'Kueri = %s
' +
'Info Jalur = %s
'+
'JalurDiterjemahkan = %s
'+
'TotalByte = %d
'+
'TersediaBytes = %d
'+
'Tipe Konten = %s
'+
'
[ECB.cbUkuran
ECB.dwVersion
ECB.ConnID
Metode ECB.lpsz
ECB.lpszQueryString
ECB.lpszPathInfo
ECB.lpszPathDiterjemahkan
ECB.cbTotalBytes
ECB.cbTersedia
ECB.lpszContentType]);
dengan ECB lakukan
mulai
StrLen := Ukuran(Buf);
DapatkanServerVariable(ConnID
'REMOTE_ADDR'
@Buf
StrLen);
ResStr := ResStr + 'REMOTE_ADDR = '+Buf+'
';
StrLen := SizeOf(Buf);
DapatkanServerVariable(ConnID
'REMOTE_HOST'
@Buf
StrLen);
ResStr := ResStr + 'Remote_Host = '+Buf+'
';
StrLen := SizeOf(Buf);
DapatkanServerVariable(ConnID
'REMOTE_USER'
@Buf
StrLen);
ResStr := ResStr + 'Pengguna_Remote = '+Buf+'
';
StrLen := SizeOf(Buf);
DapatkanServerVariable(ConnID
'SERVER_NAME'
@Buf
StrLen);
ResStr := ResStr + 'SERVER_NAME = '+Buf+'
';
StrLen := SizeOf(Buf);
DapatkanServerVariable(ConnID
'SERVER_PORT'
@Buf
StrLen);
ResStr := ResStr + 'SERVER_PORT = '+Buf+'
';
StrLen := SizeOf(Buf);
DapatkanServerVariable(ConnID
'SERVER_PROTOCOL'
@Buf
StrLen);
ResStr := ResStr + 'SERVER_PROTOCOL = '+Buf+'
';
StrLen := SizeOf(Buf);
DapatkanServerVariable(ConnID
'SERVER_PERANGKAT LUNAK'
@Buf
StrLen);
ResStr := Format('%sSERVER_SOFTWARE = %s
'+
'ID Utas = %.8x
'
[ResStr
Penggemar
Dapatkan ID Utas Saat Ini]);
akhir;
ResStr := ResStr + ';
ResStr := Format(
'HTTP/1.0 200 Oke'#13#10+
'Tipe Konten: teks/html'#13#10+
'Panjang Konten: %d'#13#10+
'Isi:'#13#10#13#10'%s'
[Panjang(ResStr)
ResStr]);
StrLen := Panjang(ResStr);
ECB.WriteClient(ECB.ConnID
Penunjuk(ResStr)
StrLen
0);
Hasil := HSE_STATUS_SUCCESS;
akhir;
xports
Dapatkan Versi Ekstensi
HttpExtensionProc;
misalnya
akhir.
Untuk memanggil DLL ini, Anda harus membuat skrip HRML yang menyertakan baris berikut
Tes Satu
Dapatkan informasi dari tombol "Konfirmasi".
Biasanya formulir HTML yang mengirimkan informasi kepada Anda memiliki tombol konfirmasi di dalamnya. Selama jumlah informasinya kurang dari 49KB, Anda bisa
Anggap saja bidang lpbData di TExetensionControlBlock tersedia. Inilah cara Anda bisa
Dalam kebanyakan kasus, informasi yang dikirim oleh penunjuk ke bidang ini diperoleh:
var
S: tali;
mulai
…
S := PChar(ECB.lpbData);
…
akhir;
Jika informasi yang berasal dari bidang ini lebih besar dari 48KB, maka Anda harus menghubungi ReadClient untuk mendapatkan informasi lainnya.
Jika Anda ingin mengetahui secara pasti informasi apa yang tersedia di kolom lpbData, Anda dapat menggunakan dua fungsi berikut untuk meneruskan data kembali ke browser web Anda:
fungsi SetUpResString: string;
mulai
Hasil := '+
' +
'
'lpbData = %s ' +
';
akhir;
fungsi HttpExtensionProc(var ECB: TExtensionControlBlock):
DWORD;
var
ResStr: string;
StrLen: Integer;
S
S1: tali;
mulai
ECB.lpszLogData := 'Log DLL Delphi';
ECB.dwHTTPStatusCode := 200;
ResStr := SetUpResString;
S := PChar(ECB.lpbData);
ResStr := Format(ResStr
[S]);
StrLen := Panjang(ResStr);
ECB.WriteClient(ECB.ConnID
Penunjuk(ResStr)
StrLen
0);
Hasil := HSE_STATUS_SUCCESS;
akhir;
Asumsikan Anda sudah memiliki formulir HTML dengan kode berikut terlampir:
Kode ini akan menghasilkan formulir dengan area teks untuk Anda memasukkan angka dan tombol "kirim" yang disebut "GetSquare". Jika Anda memiliki formulir ini, maka Anda dapat mengharapkan kedua program di atas akan mengembalikan string berikut, dengan asumsi pengguna memasukkan angka 23 di area teks formulir:
lpbData = GetSquare=23&GetSquare=Kirim
Untuk memahami apa yang terjadi saat ini, perhatikan bagian utama pernyataan HTML yang dikutip dari fungsi di atas. Bagian pernyataan ini berada di server dan tercermin sebagai berikut:
'lpbData = %s ' +
Jika Anda mempelajari kode dalam fungsi HttpExtensionProc di atas, Anda akan menemukan bahwa tepat sebelum kalimat ini, ia menggunakan parameter %s dalam pernyataan Format dan bukan nilai dalam ECB.lpbData. (Jika Anda tidak tahu cara kerja Format pernyataan, silakan merujuk ke dokumentasi Delphi yang relevan) [Catatan: Dalam Ensiklopedia Pemrograman Delphi2 penulis (Delphi2
Ada instruksi rinci di Bab 3 "String dan File Teks" di Unleashed (Penerjemah)]
Asumsikan bahwa dalam bentuk yang ditunjukkan di atas, ketika pengguna menekan tombol "Konfirmasi", nilai yang diteruskan oleh lpbData ke ISAPI DLL adalah:
GetSquare=23&GetSquare=Kirim
Untuk memberi Anda gambaran yang jelas, izinkan saya ulangi bahwa informasi yang dikirimkan kembali ke browser oleh dua pernyataan di atas adalah string berikut, yang telah Anda lihat:
lpbData = GetSquare=23&GetSquare=Kirim
Cara terbaik untuk melihat proses ini adalah dengan menguji jalankan program ISAPI2 yang tercantum di bawah. ISAPI2 mirip dengan ISAPI1, tetapi mencakup fungsi HttpExtensionProc baru yang ditunjukkan di atas, dan juga mencakup fungsi utilitas SetUpResString.
perpustakaan Isapi2;
kegunaan
jendela
SysUtils
HTTPEkst;
fungsi GetExtensionVersion(var Ver: THSE_VERSION_INFO):
BOOL;
mulai
Ver.dwExtensionVersion := $00010000; // 1.0 dukungan
Ver.lpszExtensionDesc := 'DLL ditulis dalam Delphi 2.0';
Hasil := Benar;
akhir;
fungsi SetUpResString: string;
mulai
Hasil := '+
' +
'
'lpbData = %s ' +
';
akhir;
fungsi HttpExtensionProc( var ECB: TEXTENSION_CONTROL_BLOCK ):
DWORD;
var
ResStr: string;
StrLen: Integer;
S
S1: tali;
Len: Bilangan Bulat;
mulai
ECB.lpszLogData := 'Log DLL Delphi';
ECB.dwHTTPStatusCode := 200;
ResStr := SetUpResString;
S := PChar(ECB.lpbData);
ResStr := Format(ResStr
[S]);
StrLen := Panjang(ResStr);
ECB.WriteClient(ECB.ConnID
Penunjuk(ResStr)
StrLen
0);
Hasil := HSE_STATUS_SUCCESS;
akhir;
ekspor
Dapatkan Versi Ekstensi
HttpExtensionProc;
mulai
akhir.
Setelah Anda memperoleh informasi yang diteruskan oleh variabel lpbData dari formulir, Anda dapat menguraikan informasi tersebut atau mengembalikannya ke pengguna. Misalnya, Anda dapat mengekstrak angka 23 dari contoh di atas, mengkuadratkannya, dan mengembalikannya ke pengguna. Melakukan hal ini memungkinkan Anda mendapatkan informasi dari pengguna, dalam hal ini angka, melakukan beberapa operasi matematika pada angka tersebut, dan akhirnya mengembalikan hasilnya kepada pengguna. Ini berarti Anda dapat membuat halaman web interaktif langsung di gelombang udara, yang merupakan aspek paling populer dari pemrograman Internet saat ini!
Berikut ini adalah kode program lengkap yang mengirimkan kuadrat suatu bilangan ke browser melalui jaringan:
perpustakaan Isapi3;
{ Kode ini menunjukkan cara mengambil masukan dari pengguna melalui browser
menguraikan informasi itu
dan kemudian mengembalikan jawaban kepada pengguna
pengguna mengirimkan nomor
kode ini mengkuadratkannya
dan kemudian mengirimkan hasilnya kembali ke pengguna. Berikut adalah formulir dari browser yang mengirimkan informasi untuk diuraikan:
}
kegunaan
jendela
SysUtils
HTTPEkst
Kotak Str;
fungsi GetExtensionVersion(var Ver: THSE_VERSION_INFO):
BOOL;
mulai
Ver.dwExtensionVersion := $00010000; // dukungan versi 1.0
Ver.lpszExtensionDesc := 'ISAPI3.DLL';
Hasil := Benar;
akhir;
// Parsing lpbData dan ambil nomor yang diberikan pengguna kepada kami.
fungsi ParseData(S: string): Integer;
mulai
S := StripLastToken(S
'&');
S := StripFirstToken(S
'=');
Hasil := StrToInt(S);
akhir;
fungsi SetUpResString: string;
mulai
Hasil := '+
' +
'
'Jawaban = %d ' +
';
akhir;
fungsi HttpExtensionProc( var ECB: TEXTENSION_CONTROL_BLOCK ):
DWORD;
var
ResStr: string;
StrLen: Integer;
S
S1: tali;
Nomor: Bilangan Bulat;
mulai
ECB.lpszLogData := 'Log DLL Delphi';
ECB.dwHTTPStatusCode := 200;
ResStr := SetUpResString;
S := PChar(ECB.lpbData);
Nomor := ParseData(S);
Bilangan := Kuadrat(Bilangan);
ResStr := Format(ResStr
[Jumlah]);
StrLen := Panjang(ResStr);
ECB.WriteClient(ECB.ConnID
Penunjuk(ResStr)
StrLen
0);
Hasil := HSE_STATUS_SUCCESS;
akhir;
ekspor
Dapatkan Versi Ekstensi
HttpExtensionProc;
mulai
akhir.
Kode ini menerima string berikut dari pengguna yang menekan tombol konfirmasi dan meminta nomor kuadrat:
GetSquare=5&GetSquare=Kirim
Dengan asumsi masukan seperti ini, kode ini akan mengembalikan string berikut ke pengguna melalui Internet:
Jawaban = 25
Dalam satu kalimat, pengguna memasukkan nomor 5, dan Anda mengembalikan nomor 25 kepada pengguna. Jika pengguna mengirimkan nomor 10, maka Anda mengembalikan nomor 100. Ini mungkin tampak sepele, tapi yang penting di sini adalah apa yang terjadi di Internet [Catatan: mengacu pada halaman web interaktif (diterjemahkan
WHO)]
Analisis fungsi yang diteruskan oleh pengguna seperti ini:
// Parsing lpbData dan ambil nomor yang diberikan pengguna kepada kami.
fungsi ParseData(S: string): Integer;
mulai
S := StripLastToken(S
'&');
S := StripFirstToken(S
'=');
Hasil := StrToInt(S);
akhir;
Kedua pernyataan ini ada dalam unit yang disebutkan di awal artikel ini dan juga disertakan di situs saya. [Catatan: Dokumen ini dapat ditemukan hampir di semua tempat di Internet
Anda juga dapat memintanya dari penerjemah (Translator)] [Dalam artikel ini
Saya hanya ingin berbicara banyak tentang ISAPI. Ini seharusnya cukup untuk menginspirasi Anda untuk bersenang-senang memanfaatkan teknologi hebat ini. Selanjutnya saya ingin berbicara tentang dua pernyataan GetServerVariable dan ReadClient. Saya hanya melakukan eksperimen yang sangat terbatas dalam hal ini. Pada artikel ini, saya telah melampirkan file HTTPEXT.PAS karena Anda tidak akan menemukannya di tempat lain selain dokumen penting ini.
Pernyataan GetServerVariable dan ReadClient
Sama seperti meminta informasi dalam aplikasi CGI Anda, Anda dapat menggunakan pernyataan untuk mendapatkan informasi dari server. Berikut ini contoh pemanggilan pernyataan ini:
Len := HseMaxExtDllNameLen;
SetPanjang(S1
Len);
Des(Len);
ECB.GetServerVariable(ECB.ConnID
'CONTENT_LENGTH'
PChar(S1)
Len);
Pertama, kode ini menetapkan panjang buffer yang menyimpan informasi yang diambil dari server. Ia kemudian memanggil server dan membuat permintaan, dalam hal ini, ia meminta "CONTENT_LENGTH" pesan dari server.
Dokumentasi Microsoft memberi tahu kami bahwa Anda dapat meneruskan string berikut sebagai parameter kedua GetServerVariable:
AUTH_TYPE Berisi jenis otorisasi yang digunakan. Misalnya, jika Anda menggunakan otorisasi dasar, maka
Stringnya adalah "basic"; jika merupakan respons tantangan NT, stringnya adalah "NTLM". Otorisasi lain memiliki string khusus yang sesuai. Karena jenis otorisasi baru terus-menerus ditambahkan ke server, tidak mungkin untuk membuat daftar semua string yang mungkin. Jika string kosong, tidak ada otorisasi yang digunakan.
CONTENT_LENGTH Jumlah byte yang diharapkan skrip untuk diperoleh kembali dari klien.
CONTENT_TYPE Jenis konten informasi yang disediakan oleh isi iklan permintaan. [Catatan: Adiknya kurang berbakat dan kurang berpengetahuan, a
Permintaan POST untuk sementara diterjemahkan sebagai "pemberitahuan permintaan", mohon koreksi saya (penerjemah)]
PATH_INFO Informasi perutean tambahan, disediakan oleh klien. Ini berisi jalur ke URL yang mengikuti nama skrip
Tergantung pada. Jika ada, itu mendahului string permintaan.
Path_translasi Ini adalah nilai path_info tetapi berisi nama -nama semua rute virtual yang diperluas ke bendera path.
Query_string informasi mengikuti "?" Di URL yang mengacu pada skrip ini.
Remote_addr Alamat IP klien yang meminta atau agennya (misalnya, gateway atau firewall).
Remote_host Nama host klien yang meminta atau agennya (misalnya, gateway atau firewall).
Remote_user Ini berisi nama pengguna yang disediakan oleh klien dan disahkan oleh server. Jika string kosong dikembalikan maka pengguna
atas nama Anda (tetapi dengan otorisasi).
Unmapped_remote_user Ini adalah nama pengguna dengan karakteristik berikut: Pengguna ini mengajukan permintaan ke akun pengguna NT (ini adalah identitasnya), sebelum itu filter aplikasi ISAPI memetakan pengguna.
Request_method adalah metode permintaan HTTP.
Script_name Nama skrip yang dieksekusi.
Server_name nama host atau alamat IP saat muncul dalam URL referensi-diri.
Server_port port TCP/IP yang menerima permintaan.
Server_port_secure string yaitu 0 atau 1. Itu adalah 1 ketika permintaan ditangani oleh port yang aman;
Server_Protocol menerima nama dan versi informasi protokol yang terkait dengan permintaan ini. Biasanya http/1.0.
Server_Software adalah nama dan versi server web tempat program ISAPI Application DLL berjalan. All_http Variabel sebelumnya tidak mengurai semua header http. Variabel -variabel ini berasal dari http_ <nama header lapangan>. Header lapangan (dipisahkan oleh penanda garis) berisi string individual, yang tidak diakhiri.
Http_accept kasus khusus header bidang http. Nilai yang diterima adalah: bidang yang dipisahkan oleh koma (,). Misalnya: jika
Baris -baris berikut adalah bagian dari header HTTP:
Terima: */ *, q = 0.1
Kemudian URL (fitur baru di versi 2.0) memberikan bagian dasarnya.
Perhatikan bahwa bagian informasi yang diberikan di atas secara otomatis diteruskan oleh catatan TextensionControlBlock. Karena
Anda tidak perlu menelepon GoterVerVariable untuk ini. Namun, Anda dapat memanggilnya jika Anda benar -benar membutuhkannya, terutama jika Anda ingin mendapatkan informasi dari ReadClient dan perlu tahu berapa banyak informasi yang harus dibaca.
Sering kali, Anda tidak perlu menelepon ReadClient. Namun, ukuran pesan yang dikirim oleh browser Anda lebih besar dari 48kb
Waktu, Anda perlu menghubungi ReadClient untuk mendapatkan sisa informasi.