`
ihuashao
  • 浏览: 4722810 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

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;
}

分享到:
评论

相关推荐

    vbs httppost上传表单脚本

    vbs 的post上传表单示例.vbs用http"WinHttp.WinHttpRequest.5.1"可伪造cookie

    HTTP HTTPS POST GET(包含curl版本和winhttp两种实现),修复bug版

    可能包含C++、C#、Java或其他编程语言的源代码,这些代码将演示如何使用curl库或WinHTTP API创建请求,处理响应,并解决可能出现的问题。 在这个项目中,修复的bug可能涉及到SSL/TLS握手、证书验证、数据编码或解码...

    WinHTTP.v3.1.For.Delphi

    总之,WinHTTP.v3.1 是一个强大而全面的 HTTP 客户端解决方案,对于 Delphi 开发者而言,它极大地简化了网络编程,提高了开发效率。通过它,开发者可以快速构建出具备高级网络功能的应用程序,无论是简单的数据交换...

    winhttp文件上传

    在IT行业中,文件上传是一项常见的任务,特别是在Web开发和客户端应用程序中。`winhttp`是Windows操作系统提供的一个HTTP客户端库,用于实现HTTP协议的通信。本文将深入探讨如何使用C++通过winhttp库进行文件上传,...

    delphi 控件WinHTTP.v3.1.For.Delphi5679.CR

    7. **错误处理和调试**:提供丰富的错误处理机制,帮助开发者定位和解决在进行HTTP通信时遇到的问题。 8. **兼容性**:适用于Delphi 5、6、7、9多个版本,意味着它具有良好的向后兼容性,可以在较旧的Delphi环境中...

    C++ HTTP HTTPS POST GET(curl和winhttp实现).zip

    POST则用于向服务器发送数据,如表单提交,其参数包含在请求体中。在HTTPS场景下,这两种方法同样适用,但因为数据被加密,所以更安全。 1. **curl库**: curl是一个强大的命令行工具和库,用于传输数据,支持多种...

    HTTP HTTPS POST GET(包含curl版本和winhttp两种实现)

    POST则用于向服务器提交数据,如表单提交,它将数据放在请求体中,相对更安全,适合传递敏感信息。 在编程中,我们常常需要发送HTTP请求来与服务器进行交互。CURL是一个强大的命令行工具,支持多种协议,包括HTTP、...

    易语言-纯Winhttp POST登录淘宝取得订单信息

    总的来说,"纯Winhttp POST登录淘宝取得订单信息"的项目涵盖了易语言的GUI编程、网络通信、模块化开发以及与第三方API的交互等多个知识点。通过这个项目,开发者可以深入理解易语言在网络编程中的应用,并掌握登录...

    易语言WinHttp对象应用

    例如,你可以通过它来获取网页内容并进行解析,或者向服务器提交表单数据进行登录操作。 通过深入理解和熟练运用易语言的WinHttp对象,开发者可以构建出强大的网络应用程序,实现与互联网的交互,满足各种网络功能...

    winhttp.zip

    - **POST**:POST请求用于向服务器发送数据,常用于提交表单或上传文件。POST请求的数据位于请求体中,可以携带大量数据,且不会显示在URL中,更安全。 3. **使用WinHTTP API**: - **初始化WinHTTP**:首先需要...

    【最新】C++ http 服务端,接收来自http post form_data文件(图片)源码

    POST请求是HTTP协议中的一个重要方法,用于向服务器发送数据,通常用于提交表单数据或上传文件。 在C++中实现HTTP服务端,我们可以利用开源库,比如Poco库或者cpprestsdk(原Casablanca库),它们提供了方便的API来...

    VC_POST_FILE.rar_POST_php POST源码_post 服务端_vc post_vc++php

    在Web开发中,POST是HTTP协议中的一个请求方法,用于向服务器发送数据,常用于提交表单、上传文件等场景。 描述中提到"VC利用POST方法提交请求,并附有PHP服务端源码",这说明压缩包内不仅包含了VC++编写的客户端...

    wince下使用winnet函数实现post文件

    注意在实际开发中,还需要考虑错误处理、网络状况、代理设置等问题,确保程序的健壮性和适应性。同时,对于大文件上传,可能需要分块上传或断点续传等高级策略。希望这篇文章对你在WinCE环境下进行HTTP POST操作有所...

    VB http POST.zip_POST_VB POST _http post_vb.net http post

    在VB(Visual Basic)编程中,HTTP POST方法用于向服务器发送数据,这通常涉及到Web服务交互、API调用或者网页表单提交。本项目提供的"VB http POST.zip"包含了一个VB6的示例,演示了如何实现HTTP POST请求。下面...

    【Delphi】http post请求 webservices接口

    POST是HTTP协议中的一个方法,用于向服务器发送数据,常用于提交表单或上传文件。在与Web服务交互时,POST请求常用来传递请求参数,这些参数通常以XML格式封装在请求体中。 SOAP是一种基于XML的协议,用于在分布式...

    vc客户端通过HTTP的POST方式传送文件到PHP服务器

    POST请求常用于向服务器发送数据,如表单提交或文件上传。与GET请求不同,POST请求的数据不会显示在URL中,而是包含在请求体中,因此可以处理更大、更复杂的数据。 在VC客户端,我们需要使用Winsock库或者更高层次...

    之乎者也POST高级班教程

    预备课 WINHTTP协议讲解。第1课 QQ邮箱登录。第2课 获取QQ邮件列表。第3课 发送QQ邮件。第4课 YY注册。第5课 迅雷登录。第6课 5173登录。第7课 DZ论坛QQ登录。第8课 POST上传图片。第9课 复杂表单数据的...

    一个实现网页的自动post的程序源代码

    网页自动POST程序是一种用于模拟用户在网页上填写表单并提交数据的技术。在这个主题中,我们将深入探讨POST方法,源代码实现,...通过深入研究和修改这个代码,你可以更好地理解和应用HTTP POST技术,解决实际问题。

    vc post上传文件,下载文件控件

    在HTTP协议中,POST方法用于向服务器发送数据,常用于提交表单或者上传文件。在VC++中,你可以使用WinInet库或 WinHttp库来实现这个功能。这些库提供了API接口,如InternetOpen、InternetConnect、HttpOpenRequest和...

    MFC 模拟登陆商都论坛

    在本文中,我们将深入探讨如何使用Microsoft Foundation Class (MFC) 库以及WinHTTP API来模拟登录商都论坛。MFC是微软为Windows应用程序开发提供的一套C++类库,而WinHTTP则是一个用于网络通信的API,尤其适用于...

Global site tag (gtag.js) - Google Analytics