问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
你好,欢迎来到懂视!登录注册
当前位置: 首页 - 正文

如何在VC中WININET使用HTTP的POSTA和GET方法

发布网友 发布时间:2022-04-25 16:41

我来回答

1个回答

热心网友 时间:2023-10-19 06:55

Post资料:
SUMMARY
To properly simulate a Form submission using WinInet, you need to send a header that indicates the proper Content-Type. For Forms, the proper Content-Type header is: Content-Type: application/x-www-form-urlencoded

MORE INFORMATION
In many cases, the server does not respond appropriately if a Content-Type is not specified. For example, the Active Server Pages component of IIS 3.0 actually checks this header specifically for 'application/x-www-form- urlencoded' before adding form variables to the "Request.Form" object. This MIME/Content-Type indicates that the data of the request is a list of URL- encoded form variables. URL-encoding means that space character (ASCII 32) is encoded as ' ', special character such '!' encoded in hexadecemal form as '!'.

Here is a snippet of code that uses the MFC WinInet classes to simulate a Form POST request:
CString strHeaders = _T("Content-Type: application/x-www-form-urlencoded");
// URL-encoded form variables -
// name = "John Doe", userid = "hithere", other = "P&Q"
CString strFormData = _T("name=John Doe&userid=hithere&other=P&Q");
CInternetSession session;
CHttpConnection* pConnection = session.GetHttpConnection(_T("ServerNameHere"));
CHttpFile* pFile = pConnection->OpenRequest(CHttpConnection::HTTP_VERB_POST,_T("FormActionHere"));
BOOL result = pFile->SendRequest(strHeaders,(LPVOID)(LPCTSTR)strFormData, strFormData.GetLength());

Without MFC, the same code translates to straight SDK calls as follows:

static
TCHAR hdrs[] = _T("Content-Type: application/x-www-form-urlencoded");

static
TCHAR frmdata[] = _T("name=John Doe&userid=hithere&other=P&Q");
statuc TCHAR accept[] = _T("Accept: */*");

// for clarity, error-checking has been removed
HINTERNET hSession = InternetOpen("MyAgent",INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
HINTERNET hConnect = InternetConnect(hSession, _T("ServerNameHere"),
INTERNET_DEFAULT_HTTP_PORT,
NULL,
NULL,
INTERNET_SERVICE_HTTP,
0,
1);
HINTERNET hRequest = HttpOpenRequest(hConnect,
"POST",
_T("FormActionHere"),
NULL,
NULL,
accept,
0,
1);
HttpSendRequest(hRequest,
hdrs,
strlen(hdrs),
frmdata,
strlen(frmdata));

// close any valid internet-handles

我这里有一段程序,用来在一个对话框里显示出一次http request的原始信息,不过使用Inet API做的,希望能有帮助。
void CHTTPRequestDlg::OnButtonRequest()
{
UpdateData(TRUE);
HINTERNET hInternet = InternetOpen("Mozilla/4.0 (compatible; MSIE 5.0; Windows NT 5.0)",
INTERNET_OPEN_TYPE_DIRECT,
NULL,
NULL,
NULL);
HINTERNET hSession = InternetConnect(hInternet,
m_strHost,
m_nPort,
"username",
"password",
INTERNET_SERVICE_HTTP,
0,
0);
char* szAccept[] = {"*/*",NULL};
CString strVerb;
m_comboVerb.GetWindowText(strVerb);
HINTERNET hRequest = HttpOpenRequest(hSession,
strVerb,
m_strObject,
NULL,
NULL,
(LPCSTR*)szAccept,
0,
0);
struct
{
char* Language;
char* Encoding;
char* ContentType;
}Headers = {"Accept-Language:zh-cn\r\n",
"Accept-Encoding:gzip,deflate\r\n",
"Content-Type:application/x-www-form-urlencoded\r\n"};

if(m_bLanguage)
{
HttpAddRequestHeaders(hRequest,
Headers.Language,
-1,
HTTP_ADDREQ_FLAG_ADD|HTTP_ADDREQ_FLAG_REPLACE);
}
if(m_bEncoding)
{
HttpAddRequestHeaders(hRequest,
Headers.Encoding,
-1,
HTTP_ADDREQ_FLAG_ADD|HTTP_ADDREQ_FLAG_REPLACE);
}
if(m_bContentType)
{
HttpAddRequestHeaders(hRequest,
Headers.ContentType,
-1,
HTTP_ADDREQ_FLAG_ADD|HTTP_ADDREQ_FLAG_REPLACE);
}
LPCSTR lpAddHeader = NULL;
LPCSTR lpContent = NULL;

if(m_strHeaders.GetLength())
{
if(m_strHeaders.Right(2) != "\r\n")
{
m_strHeaders+="\r\n";
}
lpAddHeader = (LPCSTR)m_strHeaders;
}
if(m_strContent.GetLength() && (strVerb == "POST" || strVerb == "PUT"))
{
lpContent = (LPCSTR)m_strContent;
}
HttpSendRequest(hRequest,
lpAddHeader,
-1,
(LPVOID)lpContent,
m_strContent.GetLength());

m_editContentGot.SetSel(0,-1);
m_editContentGot.ReplaceSel("");

LPSTR lpszData; //buffer for the data
DWORD dwSize; //size of the data available
DWORD dwDownloaded; //size of the downloaded data

//Set the cursor to an hourglass.
SetCursor(LoadCursor(NULL,IDC_WAIT));

// This loop handles reading the data.
while(1)
{
// The call to InternetQueryDataAvailable determines the amount of
// data available to download.
if (!InternetQueryDataAvailable(hRequest,&dwSize,0,0))
{
SetCursor(LoadCursor(NULL,IDC_ARROW));
break;
}
else
{
// Allocates a buffer of the size returned by InternetQueryDataAvailable
lpszData = new char[dwSize+1];

// Reads the data from the HINTERNET handle.
if(!InternetReadFile(hRequest,(LPVOID)lpszData,dwSize,&dwDownloaded))
{
delete[] lpszData;
break;
}
else
{
// Adds a null terminator to the end of the data buffer
lpszData[dwDownloaded]='\0';

int nLen = m_editContentGot.GetWindowTextLength();
m_editContentGot.SetSel(nLen-1, nLen-1);
m_editContentGot.ReplaceSel(lpszData);

// Delete the two buffers
delete[] lpszData;

// Check the size of the remaining data. If it is zero, break.
if (dwDownloaded == 0)
{
break;
}
}
}
}

// Close the HINTERNET handle
InternetCloseHandle(hRequest);
InternetCloseHandle(hSession);
InternetCloseHandle(hInternet);

// Set the cursor back to an arrow
SetCursor(LoadCursor(NULL,IDC_ARROW));
}
==========================================

关文件:#include <afxinet.h>
使用MFC示例如下:
首先设置m_strRequest请求字符串 eg."name=aaa&pass=bbb";
m_strServerName 服务器名称或者IP eg."www.yahoo.com"
m_strObjectName 请求文件位置 eg. "pub/aaa.asp"
请求的结果存放在m_strHtml中
void func()
{
CInternetSession m_InetSession("session");
CHttpConnection *pServer = NULL;
CHttpFile* pFile = NULL;
try
{
INTERNET_PORT nPort;
nPort=80;
pServer = m_InetSession.GetHttpConnection(m_strServerName, nPort);
pFile = pServer->OpenRequest(CHttpConnection::HTTP_VERB_POST,m_strObjectName);
char szHeaders[100];
strcpy(szHeaders,"Accept: text*/*\r\nContent-Type: application/x-www-form-urlencoded");
pFile->AddRequestHeaders(szHeaders);

pFile->SendRequestEx(m_strRequest.GetLength());
pFile->WriteString(m_strRequest);//重要-->m_Request 中有"name=aaa&name2=BBB&"
pFile->EndRequest();
DWORD dwRet;
pFile->QueryInfoStatusCode(dwRet);
CString str;

//m_Mutex.Lock();
m_strHtml="";
char szBuff[1024];

if (dwRet == HTTP_STATUS_OK)
{
UINT nRead;
while ((nRead = pFile->Read(szBuff,1023))>0)
{
m_strHtml += CString(szBuff,nRead);
}
}
//m_Mutex.Unlock();

delete pFile;
delete pServer;
}
catch (CInternetException* e)
{
CString s;
s.Format("Internet Exception\r\nm_dwError%u,m_dwContextError%u",e->m_dwError,e->m_dwContext);
AfxMessageBox(s);
//catch errors from WinInet
}
}

============================

1、获得WebBrowser Control的DWebBrowserEvents2::DocumentComplete事件
2、在DWebBrowserEvents2::DocumentComplete事件中根据IWebBrowser2::Document获得IHTMLDocument2
3、IHTMLDocument2::forms得到IHTMLElementCollection
4、在IHTMLElementCollection中根据name、tagName、ID得到指定的IHTMLElement
5、从IHTMLElement得到IHTMLFormElement
6、执行IHTMLFormElement::submit

==================================================
关于VC post cookie 问题

如果是用WinInet接口来进行HTTP开发的,那么在你HttpOpenRequest时加上INTERNET_FLAG_NO_COOKIES标志,然后在你调用HttpSendRequest之前,使用相关的接口如HttpAddRequestHeaders加上你的COOKIE头,这样HttpSendRequest发出的http数据包就包含有你指定的COOKIE头部。比如:这是我写的某个代码片段,供参考:HINTERNET hI...

Load Port、SMIF

威孚(苏州)半导体技术有限公司是一家专注生产、研发、销售晶圆传输设备整机模块(EFEM/SORTER)及核心零部件的高科技半导体公司。公司核心团队均拥有多年半导体行业从业经验,其中技术团队成员博士、硕士学历占比80%以上,依托丰富的软件底层...

编程高手进--如何Post,以及post之后服务器的返回文件什么样子

Create a CInternetSession object.Initializes WinInet and connects to server.Connect to an HTTP server.Use CInternetSession::GetHttpConnection.Returns a CHttpConnection object.Open an HTTP request.Use CHttpConnection::OpenRequest.Returns a CHttpFile object.Send an HTTP request.Use CHttpFile::...

HttpQueryInfoVC声明

HttpQueryInfo函数是Windows网络接口Wininet库中的一个函数,用于从HTTP请求中获取特定的信息。该函数的原型如下:BOOL WINAPI HttpQueryInfo(HINTERNET hRequest, DWORD dwInfoLevel, LPVOID lpBuffer, LPDWORD lpdwBufferLength, LPDWORD lpdwIndex);参数解释:hRequest: 一个HTTP请求的句柄,通过INTERNETOpen...

如何在VC程序中获取IE浏览器的代理服务器设置

在具体使用的时候需要增加头文件#include &lt;wini.h&gt;和库 WININET.LIB 程序代码 --- ProxyType 代理类型,如HTTP,SOCKS,FTP...ProxyAddr 返回代理服务器的地址 ProxyPort 返回代理服务器的端口 返回值 0: 无错误 -1: 查询IE的代理失败 -2: 无此类型的代理 -3: 其他错误 -4: 无代理设置信息 in...

C/C++怎么实现post数据提交?

在点击左侧的Linker, 点Input,点Additional Dependences, 点Edit, 添加一行$(ProjectDir)\libcurl.lib 确定 5. 代码。右键点项目名字,Add New Item-&gt;C++ File, name写main.c, 输入代码:/* 抱歉,这里不好贴链接,版权没法贴,版权去看http-post.c */ include &lt;stdio.h&gt; include &lt;curl/curl.h...

用wininet的InternetReadFile如何得知文件大小

手上的一个VB项目(过程中发现,.Net果然是好啊),需要在一个ActiveX中实现HTTP下载功能,我是采用InternetreadFile这个API来实现,一开始的代码我是这么写的 Function Gethttpdownload(sUrl As String) As boolen Dim s As String Dim hOpen As Long Dim hOpenUrl As Long Dim bDoLoop As Boolean...

...ping = InternetCheckConnection("http://www.baidu.com", 1...

我估计你没有包含这个函数的头文件和链接库,在源文件中加上这两句:include&lt;WinInet.h&gt;#pragma comment(lib,"WinInet.lib")如果还是失败,请将代码或错误信息发上来。

易语言里面的http读文件在vb里面怎么写?详细点 比如需要增加怎么组建都...

DecisionQuery在内的6个数据仓库组件和包括QRChart, QRExpr 在内的20多个报表组建,可灵活表现数据 ★★★ VC:同数据访问对象 ★ JAVA:不同的IDE具有不同的组件,比较著名的有Jbuilder,PowerJ, VisualAge for Java ★★ 语句执行方式: VB:将一句SQL串绑定到一个命令对象中,结果返回到ResultSet对象 中自行拆取 ...

如何使用 Dependency Walker

MSVBVM50.dll 使用VB5.0编写,在Windows 98(SE)上自带该DLL。MSVBVM60.dll 使用VB6.0编写,在Windows Me/2000/XP等系统上自带该DLL。ADVAPI32.dll 可能会进行注册表操作。WSOCK32.dll 具备网络通讯功能。WS2_32.dll 具备网络通讯功能。WININET.dll 具备HTTP浏览、下载等功能,典型的例子是浏览器、...

开发网游需要学习哪些课程?

一个开源的网络游戏,你可以从中看出游戏服务器的编写方法: http://themanaworld.org 游戏开发交流: http://www.gameres.com 其它,你可以搜索这些关键字: RAKNET,OPENTNL。 希望有用! 以上是服务器的,如果是客户端的话,就更多了。网络游戏开发http://baike.baidu.com/view/691941.html?wtp=tt恩,杭州有个...

声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com
空调上面有个雪花是什么标志? 民法典中如何更改孩子的抚养权 晚上十二点多出来捡到一兜东西,里面有矿泉水瓶,杯子,还有一个盒子里面装... 客厅里水杯底部夜里无故破碎什么原因 婆婆晚上九点左右喝完水,杯子 除夕过了十二点了杯子没放好破了 零晨十二点打碎了杯子好不好 快递客服用什么智能输入法好?要输入很多地名 现在的公关,文秘,文员,秘书,客服都是用什么输入法的?有谁是这些的工作... 息灭的近义词 息灭的近义词和反义词是什么_息灭是什么意思? 在VB中的Variable函数中声明的自己定义的类为类型为什么不可用?急用!谢了! VHDL语言中with-select-when语句能对变量variable赋值吗? 一个VC 编辑框换行的小问题 AE中如何保存文件的问题 AE视频都篇好了然后怎么保存起来啊谁知道的告诉下谢谢 我用AE抠完图怎么保存 ae怎么保存视频 AE如何保存文件 ae怎么保存到桌面 Ae完成作品怎么保存发送 深圳发布公积金新规:其他住房消费提取须在深有房 课题研究,关于饮水与健康的课题总结,500字左右,你们能提供多少算多少,必有重谢。 深圳住房公积金? 可以代替指纹的细菌云说明文阅读答案 根据文章内容,请你设想一下“ 深圳住房公积金第一次去银行提取后,第二次想提取还要去银行柜台办理吗 充分饮水,为健康给力 现在阅读文答案 饮水与健康 阅读答案 饮水与健康 说明文阅读 昨晚我梦见我儿子喊肚子痛,而且痛的很厉害。 饮水与健康阅读答案 为什么我手机充了话费 没有信息提示? 安装 ecshop后报错 Strict standards: Only variables should be passed by reference in 为什么我的手机充了话费没有信息提示,每次充完都要确认一下,好麻烦... PHP的T_VARIABLE&#39; or `&#39;$&#39;&#39;错误是什么意思? 为什么充值后没有收到短信提醒? 数字钟vhdl程序代码源 交话费没有短信通知 ios instance variable xxxx&#39;accessed in class method 怎么解决 充了话费为什么没有短信通知? 为什么我交完话费没有短信提示 刚刚用微信交的话费,为什么没有短信提示? 怎么每次交话费都没有短信提醒? 为什么联通充值完话费没有短信提示? 今天充了话费,没有短信提示,但钱扣去怎么办 交了话费为什么没有短信 行李箱的尺寸如何算?比如24寸,那是多,厚,长,宽 为什么充话费没有信息提示? 德国留学的行李问题!!! 有什么程序可以让手机定时放歌。并且可以设几个时间段 宽42厚24长57的行李箱多大
  • 焦点

最新推荐

猜你喜欢

热门推荐