Uniform Resource Locators (URL) di WinHTTP
URL adalah representasi ringkas dari lokasi dan metode akses untuk sumber daya yang terletak di Internet. Setiap URL terdiri dari skema (HTTP, HTTPS, FTP, atau Gopher) dan string khusus skema. String ini juga dapat menyertakan kombinasi jalur direktori, string pencarian, atau nama sumber daya. Fungsi Microsoft Windows HTTP Services (WinHTTP) menyediakan kemampuan untuk membuat, menggabungkan, memecah, dan mengosonalisasi URL. Untuk informasi selengkapnya, lihat RFC 1738, Pencari Sumber Daya Seragam dan RFC 2396, Pengidentifikasi Sumber Daya Seragam (URI): Sintaks Generik.
Apa itu URL Kanonis?
Sintaks dan semantik URL yang ditentukan memberi ruang untuk variasi dan kesalahan. Canonicalization adalah proses normalisasi URL aktual ke dalam bentuk "kanonis" yang benar, standar.
Ini melibatkan pengkodean beberapa karakter sebagai "urutan escape." Karakter AS-ASCII alfanumerik tidak perlu dikodekan (digit 0-9, huruf besar A-Z, dan huruf kecil a-z). Sebagian besar karakter lain harus diloloskan, termasuk karakter kontrol, karakter spasi, tanda persen, "karakter tidak aman" ( <, , >", #, {, }, |, \, ^, ~, ], dan ' ), dan semua karakter dengan titik kode di atas 127.
Menggunakan Fungsi WinHTTP untuk Menangani URL
WinHTTP menyediakan dua fungsi untuk menangani URL. WinHttpCrackUrl memisahkan URL ke dalam bagian komponennya, dan WinHttpCreateUrl membuat URL dari komponen.
Memisahkan URL
Fungsi WinHttpCrackUrl memisahkan URL ke dalam bagian komponennya dan mengembalikan komponen yang ditunjukkan oleh struktur URL_COMPONENTS yang diteruskan ke fungsi.
Komponen yang membentuk struktur URL_COMPONENTS adalah nomor skema, nama host, nomor port, nama pengguna, kata sandi, jalur URL, dan informasi tambahan seperti parameter pencarian. Setiap komponen, kecuali skema dan nomor port, memiliki anggota string yang menyimpan informasi dan anggota yang memegang panjang anggota string. Skema dan nomor port hanya memiliki anggota yang menyimpan nilai yang sesuai; baik skema maupun nomor port dikembalikan pada semua panggilan yang berhasil ke WinHttpCrackUrl.
Untuk mengambil nilai komponen tertentu dalam struktur URL_COMPONENTS , anggota yang menyimpan panjang string komponen tersebut harus diatur ke nilai bukan nol. Anggota string dapat berupa penunjuk ke buffer atau NULL.
Jika anggota pointer berisi penunjuk ke buffer, anggota panjang string harus berisi ukuran buffer tersebut. Fungsi WinHttpCrackUrl mengembalikan informasi komponen sebagai string di buffer dan menyimpan panjang string dalam anggota panjang string.
Jika anggota penunjuk diatur ke NULL, anggota panjang string dapat diatur ke nilai bukan nol apa pun. Fungsi WinHttpCrackUrl menyimpan penunjuk ke karakter pertama string URL yang berisi informasi komponen dan mengatur panjang string ke jumlah karakter di bagian sisa string URL yang berkaitan dengan komponen.
Semua anggota pointer diatur ke NULL dengan anggota panjang bukan nol menunjuk ke titik awal yang sesuai dalam string URL. Panjang yang disimpan dalam anggota panjang harus digunakan untuk menentukan akhir informasi komponen individu.
Untuk menyelesaikan inisialisasi struktur URL_COMPONENTS dengan benar, anggota dwStructSize harus diatur ke ukuran struktur URL_COMPONENTS .
Membuat URL
Fungsi WinHttpCreateUrl menggunakan informasi dalam struktur URL_COMPONENTS yang dijelaskan sebelumnya untuk membuat URL.
Untuk setiap komponen yang diperlukan, anggota pointer harus berisi pointer ke buffer yang menyimpan informasi. Anggota panjang harus diatur ke nol jika anggota penunjuk berisi penunjuk ke string yang dihentikan nol; anggota panjang harus diatur ke panjang string jika anggota penunjuk berisi penunjuk ke string yang tidak dihentikan nol. Anggota penunjuk dari komponen apa pun yang tidak diperlukan harus diatur ke NULL.
Kode sampel
Contoh kode berikut ini memperlihatkan cara menggunakan WinHttpCrackUrl dan WinHttpCreateUrl untuk membongkar URL yang sudah ada, memodifikasi salah satu komponennya, dan menyusunnya kembali menjadi URL baru.
URL_COMPONENTS urlComp;
LPCWSTR pwszUrl1 =
L"https://search.msn.com/results.asp?RS=CHECKED&FORM=MSNH&v=1&q=wininet";
DWORD dwUrlLen = 0;
// Initialize the URL_COMPONENTS structure.
ZeroMemory(&urlComp, sizeof(urlComp));
urlComp.dwStructSize = sizeof(urlComp);
// Set required component lengths to non-zero so that they are cracked.
urlComp.dwSchemeLength = (DWORD)-1;
urlComp.dwHostNameLength = (DWORD)-1;
urlComp.dwUrlPathLength = (DWORD)-1;
urlComp.dwExtraInfoLength = (DWORD)-1;
// Crack the URL.
if( !WinHttpCrackUrl( pwszUrl1, (DWORD)wcslen(pwszUrl1), 0, &urlComp ) )
printf( "Error %u in WinHttpCrackUrl.\n", GetLastError( ) );
else
{
// Change the search information. New info is the same length.
urlComp.lpszExtraInfo = L"?RS=CHECKED&FORM=MSNH&v=1&q=winhttp";
// Obtain the size of the new URL and allocate memory.
WinHttpCreateUrl( &urlComp, 0, NULL, &dwUrlLen );
LPWSTR pwszUrl2 = new WCHAR[dwUrlLen];
// Create a new URL.
if( !WinHttpCreateUrl( &urlComp, 0, pwszUrl2, &dwUrlLen ) )
printf( "Error %u in WinHttpCreateUrl.\n", GetLastError( ) );
else
{
// Show both URLs.
printf( "Old URL: %S\nNew URL: %S\n", pwszUrl1, pwszUrl2 );
}
// Free allocated memory.
delete [] pwszUrl2;
}