1. 程式人生 > >Windows C下利用wininet傳送http請求

Windows C下利用wininet傳送http請求

在Windows下,通過使用wininet庫傳送http請求,以下是程式碼例項:

char szBuffer[1024] = {0};//宣告全域性變數,作為服務端返回的資料

void SendHttpRequest(char ip[], int port, char url[])//引數說明:IP:1.2.3.4  port:40000, url:"/login"
 {
    
    DWORD dwSize = 1024;
    DWORD dwDownload = 0;
    //char data[] = "changzhi";

    //init
    HINTERNET hInternet = InternetOpen("CEHTTP", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);

    //open http session
    HINTERNET hSession = InternetConnect(hInternet, ip, port, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);

    //open http post request handle
    char * szAccept[] = {"/", NULL};
    HINTERNET hRequest = HttpOpenRequest(hSession, "POST", url, NULL, NULL, (LPCSTR*)szAccept, INTERNET_FLAG_NO_CACHE_WRITE, 0);

    //send request
    HttpSendRequest(hRequest, NULL, 0, data, strlen(data));

    //get receive data and store 
    InternetReadFile(hRequest, szBuffer, dwSize, &dwDownload);

 }

關閉這個http連線需要用到的程式碼:

    InternetCloseHandle(hRequest);
    InternetCloseHandle(hSession);
    InternetCloseHandle(hInternet);

當然了,以上程式碼要包含wininet.h這個標頭檔案。


在編譯的時候可以這樣編譯:

gcc http.c -o http -l wininet

注意要加上wininet連結庫

如果設定http的header可以這樣:

TCHAR *szHeaders = "Content-type:application/json\nAccept:application/json";

//這樣傳送請求
HttpSendRequest(hRequest, szHeaders, strlen(szHeaders, data, strlen))



需要注意的是:

當server端沒有啟動時,在執行InternetReadFile( 即返回資料 )時,是會出錯的,這點需要注意下。不明白的是,當server端沒有啟動的時候,為什麼在HttpOpenRequest或者InternetConnect的時候不報錯( 或者返回NULL ),而是InternetReadFile時出問題,希望知道答案的朋友不吝賜教。先謝謝了!