Bagikan melalui


Sesi HTTP

WinINet memungkinkan Anda mengakses sumber daya di World Wide Web (WWW). Sumber daya ini dapat diakses langsung dengan menggunakan InternetOpenUrl (untuk informasi selengkapnya, lihat Mengakses URL Secara Langsung).

Sumber daya di WWW diakses dengan menggunakan http. Fungsi HTTP menangani protokol yang mendasar, sambil memungkinkan aplikasi Anda mengakses informasi di WWW. Seiring berkembangnya protokol HTTP, protokol yang mendasar diperbarui untuk mempertahankan perilaku fungsi.

Diagram berikut menunjukkan hubungan fungsi yang digunakan dengan protokol HTTP. Kotak berbayang mewakili fungsi yang mengembalikan handel HINTERNET , sementara kotak biasa mewakili fungsi yang menggunakan handel HINTERNET yang dibuat oleh fungsi yang bergantung padanya.

fungsi wininet yang digunakan untuk http

Untuk informasi selengkapnya, lihat Handel HINTERNET.

Menggunakan Fungsi WinINet untuk Mengakses WWW

Fungsi berikut digunakan selama sesi HTTP untuk mengakses WWW.

Fungsi Deskripsi
HttpAddRequestHeaders Menambahkan header permintaan HTTP ke handel permintaan HTTP. Fungsi ini memerlukan handel yang dibuat oleh HttpOpenRequest.
HttpOpenRequest Membuka handel permintaan HTTP. Fungsi ini memerlukan handel yang dibuat oleh InternetConnect.
HttpQueryInfo Mengkueri informasi tentang permintaan HTTP. Fungsi ini memerlukan handel yang dibuat oleh fungsi HttpOpenRequest atau InternetOpenUrl .
HttpSendRequest Mengirim permintaan HTTP yang ditentukan ke server HTTP. Fungsi ini memerlukan handel yang dibuat oleh HttpOpenRequest.
InternetErrorDlg Menampilkan kotak dialog yang telah ditentukan sebelumnya untuk kondisi kesalahan Internet umum. Fungsi ini memerlukan handel yang digunakan dalam panggilan ke HttpSendRequest.

 

Memulai Koneksi ke WWW

Untuk memulai koneksi ke WWW, aplikasi harus memanggil fungsi InternetConnect pada HINTERNET root yang dikembalikan oleh InternetOpen. InternetConnect harus membuat sesi HTTP dengan mendeklarasikan jenis layanan INTERNET_SERVICE_HTTP. Untuk informasi selengkapnya tentang menggunakan InternetConnect, lihat Menggunakan InternetConnect.

Membuka Permintaan

Fungsi HttpOpenRequest membuka permintaan HTTP dan mengembalikan handel HINTERNET yang dapat digunakan oleh fungsi HTTP lainnya. Tidak seperti fungsi terbuka lainnya (seperti FtpOpenFile dan InternetOpenUrl), HttpOpenRequest tidak mengirim permintaan ke Internet ketika dipanggil. Fungsi HttpSendRequest mengirimkan permintaan dan membuat koneksi melalui jaringan.

HttpOpenRequest mengambil handel sesi HTTP yang dibuat oleh InternetConnect dan kata kerja HTTP, nama objek, string versi, perujuk, jenis penerimaan, bendera, dan nilai konteks.

Kata kerja HTTP adalah string yang akan digunakan dalam permintaan. Kata kerja HTTP umum yang digunakan dalam permintaan termasuk GET, PUT, dan POST. Jika nilai ini diatur ke NULL, HttpOpenRequest menggunakan nilai default GET.

Nama objek adalah string yang berisi nama objek target kata kerja HTTP yang ditentukan. Ini umumnya adalah nama file, modul yang dapat dieksekusi, atau penentu pencarian. Jika nama objek yang disediakan adalah string kosong, HttpOpenRequest mencari halaman default.

String versi harus berisi versi HTTP. Jika parameter ini adalah NULL, fungsi menggunakan ""HTTP/1.1"".

Perujuk menentukan alamat dokumen tempat nama objek diperoleh. Jika parameter ini NULL, tidak ada perujuk yang ditentukan.

String yang dihentikan null yang berisi jenis terima menunjukkan jenis konten yang diterima oleh aplikasi. Mengatur parameter ini ke NULL menunjukkan bahwa tidak ada jenis konten yang diterima oleh aplikasi. Jika string kosong disediakan, aplikasi menunjukkan bahwa hanya menerima dokumen jenis ""text/*"". Nilai ""text/*"" menunjukkan dokumen teks saja—bukan gambar atau file biner lainnya.

Nilai bendera mengontrol penembolokan, cookie, dan masalah keamanan. Untuk Microsoft Network (MSN), NTLM, dan jenis autentikasi lainnya, atur bendera INTERNET_FLAG_KEEP_CONNECTION .

Jika bendera INTERNET_FLAG_ASYNC diatur dalam panggilan ke InternetBuka, nilai konteks bukan nol harus diatur untuk operasi asinkron yang tepat.

Contoh berikut adalah contoh panggilan ke HttpOpenRequest.

hHttpRequest = HttpOpenRequest( hHttpSession, "GET", "", NULL, "", NULL, 0, 0);

Menambahkan Header Permintaan

Fungsi HttpAddRequestHeaders memungkinkan aplikasi untuk menambahkan satu atau beberapa header permintaan ke permintaan awal. Fungsi ini memungkinkan aplikasi untuk menambahkan header format bebas tambahan ke handel permintaan HTTP; ini dimaksudkan untuk digunakan oleh aplikasi canggih yang memerlukan kontrol yang tepat atas permintaan yang dikirim ke server HTTP.

HttpAddRequestHeaders memerlukan handel permintaan HTTP yang dibuat oleh HttpOpenRequest, string yang berisi header, panjang header, dan pengubah.

Mengirim Permintaan

HttpSendRequest membuat koneksi ke Internet dan mengirim permintaan ke situs yang ditentukan. Fungsi ini memerlukan handel HINTERNET yang dibuat oleh HttpOpenRequest. HttpSendRequest juga dapat mengirim header tambahan atau informasi opsional. Informasi opsional umumnya digunakan untuk operasi yang menulis informasi ke server, seperti PUT dan POST.

Setelah HttpSendRequest mengirim permintaan, aplikasi dapat menggunakan fungsi InternetReadFile, InternetQueryDataAvailable, dan InternetSetFilePointer pada handel HINTERNET yang dibuat oleh HttpOpenRequest untuk mengunduh sumber daya server.

Memposting Data ke Server

Untuk memposting data ke server, kata kerja HTTP dalam panggilan ke HttpOpenRequest harus BERUPA POST atau PUT. Alamat buffer yang berisi data POST kemudian harus diteruskan ke parameter lpOptional di HttpSendRequest. Parameter dwOptionalLength harus diatur ke ukuran data.

Anda juga dapat menggunakan fungsi InternetWriteFile untuk memposting data pada handel HINTERNET yang dikirim menggunakan HttpSendRequestEx.

Mendapatkan Informasi Tentang Permintaan

HttpQueryInfo memungkinkan aplikasi untuk mengambil informasi tentang permintaan HTTP. Fungsi ini memerlukan handel HINTERNET yang dibuat oleh HttpOpenRequest atau InternetOpenUrl, nilai tingkat informasi, dan panjang buffer. HttpQueryInfo juga menerima buffer yang menyimpan informasi dan indeks header berbasis nol yang menghitung beberapa header dengan nama yang sama.

Mengunduh Sumber Daya dari WWW

Setelah membuka permintaan dengan HttpOpenRequest dan mengirimkannya ke server dengan HttpSendRequest, aplikasi dapat menggunakan fungsi InternetReadFile, InternetQueryDataAvailable, dan InternetSetFilePointer untuk mengunduh sumber daya dari server HTTP.

Contoh berikut mengunduh sumber daya. Fungsi menerima handel ke jendela saat ini, nomor identifikasi kotak edit, dan handel HINTERNET yang dibuat oleh HttpOpenRequest dan dikirim oleh HttpSendRequest. Ini menggunakan InternetQueryDataAvailable untuk menentukan ukuran sumber daya dan kemudian mengunduhnya menggunakan InternetReadFile. Konten kemudian ditampilkan dalam kotak edit.

int WINAPI Dumper(HWND hX, int intCtrlID, HINTERNET hResource)
{
    LPTSTR lpszData;    // buffer for the data
    DWORD  dwSize;       // size of the data available
    DWORD  dwDownloaded; // size of the downloaded data
    DWORD  dwSizeSum=0;  // size of the data in the textbox
    LPTSTR lpszHolding;  // buffer to merge the textbox data and buffer

    // Set the cursor to an hourglass.
    SetCursor(LoadCursor(NULL,IDC_WAIT));

    // This loop handles reading the data.
    do
    {
        // The call to InternetQueryDataAvailable determines the
        // amount of data available to download.
        if (!InternetQueryDataAvailable(hResource,&dwSize,0,0))
        {
            printf("InternetQueryDataAvailable failed (%d)\n", GetLastError());
            SetCursor(LoadCursor(NULL,IDC_ARROW));
            return FALSE;
        }
        else
        {
            // Allocate a buffer of the size returned by
            // InternetQueryDataAvailable.
            lpszData = new TCHAR[dwSize+1];

            // Read the data from the HINTERNET handle.
            if(!InternetReadFile(hResource,
                                 (LPVOID)lpszData,
                                 dwSize,
                                 &dwDownloaded))
            {
                printf("InternetReadFile failed (%d)\n", GetLastError());
                delete[] lpszData;
                break;
            }
            else
            {
                // Add a null terminator to the end of the data buffer
                lpszData[dwDownloaded]='\0';

                // Allocate the holding buffer.
                lpszHolding = new TCHAR[dwSizeSum + dwDownloaded + 1];

                // Check if there has been any data written
                // to the textbox.
                if (dwSizeSum != 0)
                {
                    // Retrieve the data stored in the textbox if any
                    GetDlgItemText(hX,intCtrlID,
                                   (LPTSTR)lpszHolding,
                                   dwSizeSum);

                    // Add a null terminator at the end of the
                    // textbox data.
                    lpszHolding[dwSizeSum]='\0';
                }
                else
                {
                    // Make the holding buffer an empty string.
                    lpszHolding[0]='\0';
                }

                size_t cchDest = dwSizeSum + dwDownloaded + dwDownloaded + 1;
                LPTSTR* ppszDestEnd = 0;
                size_t* pcchRemaining = 0;

                // Add the new data to the holding buffer
                HRESULT hr = StringCchCatEx(lpszHolding,
                                            cchDest,
                                            lpszData,
                                            ppszDestEnd,
                                            pcchRemaining,
                                            STRSAFE_NO_TRUNCATION);

                if(SUCCEEDED(hr))
                {
                    // Write the holding buffer to the textbox.
                    SetDlgItemText(hX,intCtrlID,(LPTSTR)lpszHolding);

                    // Delete the two buffers.
                    delete[] lpszHolding;
                    delete[] lpszData;

                    // Add the size of the downloaded data to the
                    // textbox data size.
                    dwSizeSum = dwSizeSum + dwDownloaded + 1;

                    // Check the size of the remaining data.
                    // If it is zero, break.
                    if (dwDownloaded == 0)
                        break;
                    else
                    {
                    //  TODO: Insert error handling code here.
                    }
                }
            }
        }
    }
    while(TRUE);

    // Close the HINTERNET handle.
    InternetCloseHandle(hResource);

    // Set the cursor back to an arrow.
    SetCursor(LoadCursor(NULL,IDC_ARROW));

    return TRUE;
}

Catatan

WinINet tidak mendukung implementasi server. Selain itu, itu tidak boleh digunakan dari layanan. Untuk implementasi atau layanan server, gunakan Microsoft Windows HTTP Services (WinHTTP).