wininet api函數使用經驗點滴
來源:互聯網
上載者:User
wininet api函數使用經驗點滴
著作權聲明:原創作品,允許轉載,轉載時請務必以超連結形式標明文章 原始出處 、作者資訊和本聲明。否則將追究法律責任。http://chenjava.blog.51cto.com/374566/84769
一.使用HttpSendRequestEx後,如需使用HttpQueryInfo,需先用HttpEndRequest結束Request二.BOOL HttpQueryInfo( IN HINTERNET hHttpRequest, IN DWORD dwInfoLevel, IN LPVOID lpvBuffer, IN LPDWORD lpdwBufferLength, IN OUT LPDWORD lpdwIndex,);lpdwBufferLength會返回所需的Buffer大小,因此如果多次使用此函數,需要多次對lpdwBufferLength賦值,否則會出現ERROR_INSUFFICIENT_BUFFER錯誤樣本程式: hHttpFile=HttpOpenRequest(hConnect,"POST","/avlab/index.php",NULL,NULL,0, INTERNET_FLAG_DONT_CACHE|INTERNET_FLAG_NO_COOKIES|INTERNET_FLAG_KEEP_CONNECTION |INTERNET_FLAG_RELOAD,0); HttpAddRequestHeaders(hHttpFile,szCookie,-1,HTTP_ADDREQ_FLAG_ADD); HttpAddRequestHeaders(hHttpFile,"Content-Type: application/x-www-form-urlencoded",-1,HTTP_ADDREQ_FLAG_ADD); HttpSendRequestEx(hHttpFile,&struInterIn,NULL,NULL,NULL); HttpEndRequest(hHttpFile,NULL,NULL,NULL);
nLength=512;//這一句很重要,,因為HttpQueryInfo返回的時候,會改變此值 HttpQueryInfo(hHttpFile,HTTP_QUERY_SET_COOKIE,szBuffer,(unsigned long *)&nLength,NULL);三.使用InternetReadFile一定要記得比較已經讀取的位元組數,以確定資料是否已經全部讀完 如果InternetReadFile未把response的資料讀完,後續的request會被response資料淹沒,而得不到服務端的及時響應或者無響應.這時候再HttpSendRequest,後續的HttpQueryInfo會不成功 四.字串操作時,一定要檢查傳回值,以防後續代碼進行非法操作五. 如果向網頁提交帶參數的get或者post命令,網站需要處理時間,其返回網址的內容可能還沒有更新過,如果需要擷取更新後的內容,需要對更新前後的內容進行比較六. HttpSendRequest或者HttpSendRequestEx發送訊息後如果未接受到response,則會返回NULL,Error Code被設為12002,即逾時錯誤,可以使用 InternetSetOption(hHttpFile,INTERNET_OPTION_SEND_TIMEOUT,&timeout,sizeof(DWORD)); 設定逾時時間七. 不能太依賴伺服器提供的檔案大小,因為有的時候伺服器並不提供檔案大小,此時如果再使用HttpQueryInfo擷取大小,則會出錯,GetLastError()傳回值為12150問題:1.網頁是如何?命令發送的?它發送的命令的內容儲存在哪裡?它除了構建http頭,還可以填充http訊息體?2.真是奇了怪了,http訊息居然跟multipart的part分隔字元相關,在某些分隔字元下發送會不成功,查分隔字元的取名規則本文出自 “執空法壇” 部落格,請務必保留此出處http://chenjava.blog.51cto.com/374566/84769