1. 程式人生 > >WinHTTP開發POST表單的問題及解決

WinHTTP開發POST表單的問題及解決

利用WinHTTP編寫訪問WEB頁面的客戶端,如果需要POST表單,比如輸入登陸的使用者名稱和密碼等等,以後的頁面訪問都和這個登陸的Session有關。IE瀏覽器等客戶端利用從伺服器端獲得的Cookie儲存相關資訊實現會話的一致性,具體到WinHTTP開發,查了一下,網上沒有太多相關資料,下面函式利用Get掩飾向一個網站獲取Cookie的ID號,儲存到CString中,以後的Get等操作,都利用WinHttpAddRequestHeaders將Cookie新增到Header中,然後在進行Request操作即可:

CStringW GetCookie()
{
    CStringW strCookie = L"";
    DWORD dwSize = 0;
    LPVOID lpOutBuffer = NULL;
    BOOL  bResults = FALSE;

    HINTERNET  hSession = NULL, 
        hConnect = NULL,
        hRequest = NULL;

    // Use WinHttpOpen to obtain a session handle.
    hSession = WinHttpOpen( SZ_AGENT,  
        WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
        WINHTTP_NO_PROXY_NAME, 
        WINHTTP_NO_PROXY_BYPASS, 0 );

    // Specify an HTTP server.
    if( hSession )
        hConnect = WinHttpConnect( hSession, L"wapmail.webdunia.com",
        INTERNET_DEFAULT_HTTP_PORT, 0 );

    // Create an HTTP request handle.
    if( hConnect )
        hRequest = WinHttpOpenRequest( hConnect, L"GET", NULL,
        NULL, WINHTTP_NO_REFERER, 
        WINHTTP_DEFAULT_ACCEPT_TYPES, 
        0 );

    // Send a request.
    if( hRequest )
        bResults = WinHttpSendRequest( hRequest,
        WINHTTP_NO_ADDITIONAL_HEADERS, 0,
        WINHTTP_NO_REQUEST_DATA, 0, 
        0, 0 );


    // End the request.
    if (bResults)
        bResults = WinHttpReceiveResponse( hRequest, NULL);

    // First, use WinHttpQueryHeaders to obtain the size of the buffer.
    if (bResults)
    {
        WinHttpQueryHeaders( hRequest, WINHTTP_QUERY_RAW_HEADERS_CRLF,
            WINHTTP_HEADER_NAME_BY_INDEX, NULL, 
            &dwSize, WINHTTP_NO_HEADER_INDEX);

        // Allocate memory for the buffer.
        if( GetLastError( ) == ERROR_INSUFFICIENT_BUFFER )
        {
            lpOutBuffer = new WCHAR[dwSize/sizeof(WCHAR)];

            // Now, use WinHttpQueryHeaders to retrieve the header.
            bResults = WinHttpQueryHeaders( hRequest, 
                WINHTTP_QUERY_RAW_HEADERS_CRLF,
                WINHTTP_HEADER_NAME_BY_INDEX, 
                lpOutBuffer, &dwSize, 
                WINHTTP_NO_HEADER_INDEX);
        }
    }

    // Print the header contents.
    char * tmpch = (char *)malloc(sizeof(lpOutBuffer));

    if (bResults)
        sprintf(tmpch,"%S",lpOutBuffer);

    strCookie = tmpch;
    int set_cookie = strCookie.Find(L"Cookie",0);
    int semicolon = strCookie.Find (L";",set_cookie);
    if(set_cookie != -1 && semicolon != -1)
        strCookie = strCookie.Mid (set_cookie,semicolon - set_cookie) + L"/r/n";

    // Free the allocated memory.
    delete [] lpOutBuffer;

    // Report any errors.
    if (!bResults)
        printf("Error %d has occurred./n",GetLastError());

    // Close any open handles.
    if (hRequest) WinHttpCloseHandle(hRequest);
    if (hConnect) WinHttpCloseHandle(hConnect);
    if (hSession) WinHttpCloseHandle(hSession);

    return strCookie;
}

相關推薦

WinHTTP開發POST的問題解決

利用WinHTTP編寫訪問WEB頁面的客戶端,如果需要POST表單,比如輸入登陸的使用者名稱和密碼等等,以後的頁面訪問都和這個登陸的Session有關。IE瀏覽器等客戶端利用從伺服器端獲得的Cookie儲存相關資訊實現會話的一致性,具體到WinHTTP開發,查了一下,網

Angular開發(十一)-關於響應式的校驗

一、響應式表單定義 響應式表單:我們在元件中建立表單控制元件的物件樹,並使用特定的方式將繫結到元件模板中的原聲表單控制元件元素上 二、響應式表單的好處 我們可以在元件類中直接建立

第三篇:開發中的問題解決方式

.text cat 彈窗 ret 如何 配置 中項 新的 顯示 1.texarea 如何保存空格、換行? 答:var content1= $("#content").val(); var content =content1.replace(/\n|\r\n/g,"&

利用ajax異步處理POST中的數據

利用 tex oda checkbox nbsp st表 success target .ajax //防止頁面進行跳轉 $(document).ready(function(){ $("#submit").click(function(

C# Asp.net使用FormData對象實現ajax提交上傳圖片

sync ext syn data .... error post req 序列化 1、html代碼: <form id="postForm"> 文件名:<input type="text" name="filename" />

ios系統web(微信公眾號)開發遇到的問題解決方案

編輯 doc pretty ram body abs 系統 stc 大神 1.1. 頁面滾動不流暢(2017-09-25) 現象: 網頁豎向滾動或橫向滾動不流暢。 解決方案: 為滾動元素添加css樣式: -webkit-overflow-scrolling: tou

原因解決思路

data- 操作數 -m mit sdn 事物 i/o 之間 art 1、鎖表發生在insert update 、delete 中 2、鎖表的原理是 數據庫使用獨占式封鎖機制,當執行上面的語句時,對表進行鎖住,直到發生commite 或者 回滾 或者退出數據庫用戶

Ajax的post,不在url後接一大串參數鍵值對的方法

url efault opp 解決方案 數值 .cn 寫上 prevent sub $(‘#loginForm‘).on(‘submit‘,function (ev) { //阻止表單參數附在url後面 ev.stopPropagation

FormData物件提交上傳圖片/檔案

1.建立一個FormData空物件,然後使用append方法新增key/value var formdata = new FormData(); formdata.append('name','fdipzone'); formdata.append('gender','male');

控制元件

表單及控制元件 1、常用屬性 action,指定提交的地址 method,指定提交的方式,一般為get或post get方式請求:1、直接輸入地址訪問。2、表單沒有設定method時或設的為get,都是get方式的請求。get方式請求會將請求引數的名和

curl post上傳檔案(C++)

最近測試如何上傳檔案到伺服器。原來傳照片一致通過binary 形式傳檔案,或者把圖片base64編碼傳圖片。一致沒有用form-data 表單形式傳送資料,今天嘗試下如何使用libcurl提供的API上傳檔案。 Sample code: #include <

Ajax應用serialize()提交Form後端取值(Java)

<script type="text/javascript"> $(document).ready(function(){ $("#modifyForm").submit(function(e){ $("#submitButton").attr('disabled',"

SpringSecurity開發基於的認證

核心功能 認證(你是誰) 授權(你能幹什麼) 攻擊防護(防止偽造身份) 一組過濾器鏈 //所有請求都需要認證 幾乎是預設的 @Configuration public class BrowserSecurityConfig extends WebSecu

Spring MVC 接收POST請求,獲取引數總結

                 前段時間遇到一個問題,在spring mvc 服務端接收post請求時,通過html 表單提交的時候,服務端能夠接收到引數的值。但是使用httpclient4.3構造post請求,卻無法接收到引數的值。spring 程式碼:    @RequestMapping(value 

JavaScript第二課-兩種資料提交方式

1、表單標籤 <legend>註冊區域</legend> <form action="http://www.baidu.com"> 使用者名稱: <input type="text"/ name="user" ><br/

Flask Web 開發 web

 hello.py:定義表單類 from flask.ext.wtf import Form from wtforms import StringField, SubmitField from wtforms.validators import Required cla

java 後臺模擬post請求傳送key-value資料亂碼

首先是key-value的模型: public class PostValue {       private String key;           private String value;        public PostValue(String key, S

學習:從零玩轉HTML5前端+跨平臺開發標籤-非input標籤(掌握))

form表單標籤 <form action = "提交到伺服器地址">       <表單元素> </form>常見的表單元素     <input type = "text" name = "username"> 明文輸入框 

iOS開發專案BUG彙總解決方案(持續更新)

一.用Cocoapods新增第三方類庫出現‘XCTest/XCTest.h’file not found 1、點選Pods - TARGETS -[Pods-你的專案名Tests-Specta]-Build Settings ,搜尋Framework sear

使用FormData物件提交上傳圖片

FormData 物件,可以把form中所有表單元素的name與value組成一個queryString,提交到後臺。在使用Ajax提交時,使用FormData物件可以減少拼接queryString的