如何在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 <wini.h>和库 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->C++ File, name写main.c, 输入代码:/* 抱歉,这里不好贴链接,版权没法贴,版权去看http-post.c */ include <stdio.h> include <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<WinInet.h>#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恩,杭州有个...