利用IWebBrowser2接口的Navigate2方法实现Http POST传输

简介: 利用IWebBrowser2接口的Navigate2方法实现Http POST传输 飘飘白云2007/11/8 开发中的社区游戏,要求将原来的mini浏览器扩展成可以通过Http POST传输来打开网页,比如:通过提交用户id,password,用户的action(查看profile,查看日记,打开blog等等),从而在mini浏览器里打开相应的网页。
利用 IWebBrowser2 接口的 Navigate2 方法实现 Http POST 传输

飘飘白云2007/11/8

开发中的社区游戏,要求将原来的mini浏览器扩展成可以通过Http POST传输来打开网页,比如:通过提交用户idpassword,用户的action(查看profile,查看日记,打开blog等等),从而在mini浏览器里打开相应的网页。

具体实现是通过获取浏览器的IWebBrowser2指针,用该接口的Navigate2方法来实现,Navigate2MSDN描述如下,

HRESULTNavigate2(
VARIANT*URL,
VARIANT*Flags,
VARIANT*TargetFrameName,
VARIANT*PostData,
VARIANT*Headers
);

具体参数细节请参看
MSDN文档。比较麻烦的是这个函数的参数设置,后面作详细说明,先看代码。这里有如下假定

iBrowser是一个有效的IWebBrowser2指针,

url为有效的地址(如:L"http://172.24.1.241/profile/"),

postData为需要提交的数据(

如:L"userid=kesalin&password=pwd&action=profile"

//飘飘白云(l_zhaohui@163.com) 2007/11/8

IWebBrowser2* iBrowser;

LPCTSTR url;

LPCTSTR postData

........//其他代码

//Get size of Post Data

int size = WideCharToMultiByte(CP_ACP, 0, postData, -1, 0, 0, 0, 0);

VARIANT vURL;

VARIANT vFlags;

VARIANT vPostData;

VARIANT vHeaders;

VARIANT vNull;

// Init

VariantInit(&vURL);

VariantInit(&vFlags);

VariantInit(&vPostData);

VariantInit(&vHeaders);

VariantInit(&vNull);

// Set value

vHeaders.vt = VT_BSTR;

vHeaders.bstrVal = SysAllocString(L"Content-Type: application/x-www-form-urlencoded\r\n");

vFlags.vt = VT_I4;

vFlags.lVal = navNoReadFromCache | navNoWriteToCache;

vURL.vt = VT_BSTR;

vURL.bstrVal = SysAllocString(url);

if (size > 1) {

// POST

char* pPostData = new char[size + 1];

WideCharToMultiByte(CP_ACP, 0, postData, -1, pPostData, size, 0, 0);

SAFEARRAY FAR* sfPost = NULL;

SAFEARRAYBOUND bound;

bound.cElements = (ULONG) (strlen(pPostData));

bound.lLbound = 0;

sfPost = SafeArrayCreate(VT_UI1, 1, &bound);

char* pChar = pPostData;

for (long lIndex = 0; lIndex < (signed)bound.cElements; lIndex++) {

SafeArrayPutElement(sfPost, &lIndex, (void*)((pChar++)));

}

vPostData.vt = VT_ARRAY | VT_UI1;

vPostData.parray = sfPost;

delete[] pPostData;

pPostData = NULL;

pChar = NULL;

iBrowser->Navigate2(&vURL, &vFlags, &vNull, &vPostData, &vHeaders);

}

else {

// GET

iBrowser->Navigate2(&vURL, &vNull, &vNull, &vNull, &vNull);

}

// Clear

VariantClear(&vURL);

VariantClear(&vFlags);

VariantClear(&vPostData);

VariantClear(&vHeaders);

VariantClear(&vNull);

有三点值得说明:

第一, 数据类型 VT_I4 是指示一个long型的数据,所以要设置 VARIANTlVal作为值。如代码中的:

vFlags.vt = VT_I4;

vFlags.lVal = navNoReadFromCache | navNoWriteToCache;

第二, 如果要实现POST数据提交,不能将Navigate2方法中不需要的参数简单地设置成NULL,必须创建一个VARIANT变量vNull,并对它进行初始化。比如:

VariantInit(&vNull);

vNull.vt = VT_BSTR;

vNull.bstrVal = NULL;

……

iBrowser->Navigate2(&vURL, &vFlags, &vNull, &vPostData, &vHeaders);

第三, vPostData的变量类型是VT_ARRAY | VT_UI1,其数据是一个SAFEARRAY型的字符数组,具体赋值请参看代码。

目录
相关文章
|
3月前
HTTP协议中请求方式GET 与 POST 什么区别 ?
GET和POST的主要区别在于参数传递方式、安全性和应用场景。GET通过URL传递参数,长度受限且安全性较低,适合获取数据;而POST通过请求体传递参数,安全性更高,适合提交数据。
492 2
|
7月前
|
监控 测试技术 Go
告别传统Log追踪!GOAT如何用HTTP接口重塑代码监控
本文介绍了GOAT(Golang Application Tracing)工具的使用方法,通过一个Echo问答服务实例,详细展示了代码埋点与追踪技术的应用。内容涵盖初始化配置、自动埋点、手动调整埋点、数据监控及清理埋点等核心功能。GOAT适用于灰度发布、功能验证、性能分析、Bug排查和代码重构等场景,助力Go项目质量保障与平稳发布。工具以轻量高效的特点,为开发团队提供数据支持,优化决策流程。
458 89
|
7月前
|
Linux C语言 iOS开发
C语言结合AWTK开发HTTP接口访问界面
这样,我们就实现了在C语言中使用libcurl和AWTK来访问HTTP接口并在界面上显示结果。这只是一个基础的示例,你可以根据需要添加更多的功能和优化。例如,你可以添加错误处理机制、支持更多HTTP方法(如POST、PUT等)、优化用户界面等。
398 82
|
4月前
|
JSON 运维 网络协议
做短信接口时,http接口和cmpp接口怎么选?
本文介绍了短信接口中HTTP与CMPP协议的区别及适用场景,帮助开发者根据业务需求选择合适的接口类型。
473 1
|
5月前
|
Java 测试技术 容器
Jmeter工具使用:HTTP接口性能测试实战
希望这篇文章能够帮助你初步理解如何使用JMeter进行HTTP接口性能测试,有兴趣的话,你可以研究更多关于JMeter的内容。记住,只有理解并掌握了这些工具,你才能充分利用它们发挥其应有的价值。+
930 23
|
5月前
HTTP协议探究:常用方法一网打尽
总的来说,HTTP协议的命令犹如一把钥匙,解锁了互联网世界的大门。它是规则,也是工具,了解了它,就等于掌握了互联网的一把通行证。我们每天都在用,也常常无视它,但是只有深刻理解了它,才能更好地运用它。如此,我们的互联网世界旅程就会变得更加顺畅,更加有趣。
169 14
|
8月前
|
JSON API 网络架构
HTTP常见的请求方法、响应状态码、接口规范介绍
本文详细介绍了HTTP常见的请求方法、响应状态码和接口规范。通过理解和掌握这些内容,开发者可以更好地设计和实现W
1263 83
|
7月前
|
XML 网络协议 程序员
Apipost接口调试全解:从HTTP到gRPC,程序员必备的“协议生存指南
Apipost是一款强大的接口调试工具,支持多种主流API协议。它涵盖HTTP/HTTPS、WebSocket、Socket.IO、gRPC、GraphQL、TCP及ISO8583金融报文等冷门协议。通过Body多样化、全局参数配置、性能分析等功能优化HTTP调试;提供WebSocket多消息存档与事件监听;gRPC支持服务反射和流式调试;GraphQL可自动生成Schema;TCP报文模板专业精准;SSE配置简单。此外,Apipost还具备环境变量、脚本加持和文档生成功能,是提升开发效率的全能工具。
|
7月前
|
缓存 安全 Java
深入解析HTTP请求方法:Spring Boot实战与最佳实践
这篇博客结合了HTTP规范、Spring Boot实现和实际工程经验,通过代码示例、对比表格和架构图等方式,系统性地讲解了不同HTTP方法的应用场景和最佳实践。
699 5
|
8月前
|
API 开发者
了解 HTTP 的PUT 与 POST方法的综合指南
HTTP PUT 和 POST 方法是构建 Web 应用与 API 的核心工具,用于资源的创建与更新。PUT 方法通过指定 URL 更新或创建完整资源,具有幂等性;而 POST 方法更灵活,主要用于创建新资源,但不具备幂等性。本文详细对比了两者在请求体、URL 使用、资源处理等方面的区别,并提供了实际应用示例,帮助开发者根据场景选择合适的方法以优化 API 设计。

热门文章

最新文章