问题紧急,望各位不吝赐教!!

yuezimmx 2003-09-04 12:57:17
现在小弟遇到这样一个问题:

利用CGI程序实现跨平台查询(这些平台可能其他公司开发),
即在多个WEB服务器之间查询数据,
然后将查询得到的数据进行分析后转换为我们开发的系统
所呈现的页面。我是利用C WinInet编程实现的,现在简单的查询
可以利用URL上的参数字符串实现。

但现在遇到这样一个问题:很多WEB服务器都需要身份认证,即需要
先输入用户和密码后才能正确查询,并且有很多的查询参数也不是
在URL上直接指定的,好像是通过一个COOKIE(本人对COOKIE也不熟悉)。
来传递条件的。

我现在很想知道怎样才能通过程序模拟登陆WEB服务器并且实现查询,
关键是怎么通过程序输入用户和密码并且获得对方WEB服务器认证。

我不知道我是否讲清楚了我的问题,如果各位有这方面C的编程经验,
还望不吝赐教,谢谢各位了。
...全文
24 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
microran2000 2003-09-11
  • 打赏
  • 举报
回复
#import "msxml2.dll"
using namespace msxml2;
typedef struct
{
BYTE* lpszResponseHeader;//http应答头
DWORD dwHeadSize;//应答头的长度
BYTE* lpszResponseBody;//应答正文
DWORD dwSize;//应答正文长度

} HTTPRequest;
//URL请求的Web服务器地址
//headers:定制的http协议头
//post请求的数据,如果是get请求为NULL
//postLength请求的数据长度,如果是get请求为0
//HTTPRequest返回应答的内容,参考上面的结构定义
返回结构的指针占用的内存,需要调用后手工释放
//调用举例:

int SendHTTPXML(LPCSTR URL,LPCSTR headers,const BYTE *Post, DWORD postLength,HTTPRequest* Buffer)
{ Buffer->dwSize =0;
Buffer->dwHeadSize =0;
Buffer->lpszResponseBody =NULL;
Buffer->lpszResponseHeader =NULL;
try
{
CoInitialize(NULL);
MSXML::IXMLHttpRequestPtr pXH = NULL;
HRESULT hr;
if(FAILED(pXH.CreateInstance("Microsoft.XMLHTTP.1")))throw "Can not Create XMLHTTP Instance";
if(Post!=NULL){
hr=pXH->open(_bstr_t("POST"),_bstr_t(URL),CComVariant(VARIANT_FALSE),CComVariant(L""),CComVariant(L""));
if(FAILED(hr))throw "POST Error";
char *szBufferHeader=(char*)headers;
char *szBufferLN;
char *szComma;
char szHeader[1024];
char szHeaderValue[1024];
if(headers!=NULL){
while((szBufferLN=stristrA(szBufferHeader,"\r\n"))!=NULL){
szComma=stristrA(szBufferHeader,": ");
strncpy(szHeader,szBufferHeader,szComma-szBufferHeader);
szHeader[szComma-szBufferHeader]=0;
szBufferLN=stristrA(szComma,"\r\n");
strncpy(szHeaderValue,szComma+2,szBufferLN-2-szComma);
szHeaderValue[szBufferLN-2-szComma]=0;
hr=pXH->setRequestHeader(_bstr_t(szHeader), _bstr_t(szHeaderValue));
szBufferHeader=szBufferLN+2;
}

}
hr=pXH->send(_variant_t((char*)Post));
if(pXH->status >=200 && pXH->status <400){
_bstr_t bstrResponseHeaders;
_bstr_t bstrResponseText;
bstrResponseHeaders=pXH->getAllResponseHeaders();
bstrResponseText=pXH->responseText;
USES_CONVERSION;
int nLen=bstrResponseHeaders.length();
Buffer->lpszResponseHeader =(BYTE*) malloc( nLen+1);
ZeroMemory(Buffer->lpszResponseHeader,nLen+1);
memcpy(Buffer->lpszResponseHeader,OLE2CT(bstrResponseHeaders),nLen);
Buffer->dwHeadSize =nLen+1;

nLen=bstrResponseText.length();
ZeroMemory(Buffer->lpszResponseBody,nLen+1);
Buffer->lpszResponseBody=(BYTE*)malloc(nLen+1);
memcpy(Buffer->lpszResponseBody,OLE2CT(bstrResponseText),nLen);
Buffer->dwSize=nLen+1;
}
}
else
{
hr=pXH->open(_bstr_t(L"GET"),_bstr_t(URL),_variant_t(VARIANT_FALSE),_variant_t(L""),_variant_t(L""));
if(FAILED(hr))throw "POST Error";
char *szBufferHeader=(char*)headers;
char *szBufferLN;
char *szComma;
char szHeader[1024];
char szHeaderValue[1024];
if(headers!=NULL){
while((szBufferLN=stristrA(szBufferHeader,"\r\n"))!=NULL){
szComma=stristrA(szBufferHeader,": ");
strncpy(szHeader,szBufferHeader,szComma-szBufferHeader);
szHeader[szComma-szBufferHeader]=0;
szBufferLN=stristrA(szComma,"\r\n");
strncpy(szHeaderValue,szComma+2,szBufferLN-2-szComma);
szHeaderValue[szBufferLN-2-szComma]=0;
hr=pXH->setRequestHeader(_bstr_t(szHeader), _bstr_t(szHeaderValue));
szBufferHeader=szBufferLN+2;
}

}
hr=pXH->send();
if(pXH->status >=200 && pXH->status <400){
_bstr_t bstrResponseHeaders;
_bstr_t bstrResponseText;
bstrResponseHeaders=pXH->getAllResponseHeaders();
bstrResponseText=pXH->responseText;
USES_CONVERSION;
int nLen=lstrlen(OLE2CT(bstrResponseHeaders));
Buffer->lpszResponseHeader =(BYTE*) malloc( nLen+1);
ZeroMemory(Buffer->lpszResponseHeader,nLen+1);
memcpy(Buffer->lpszResponseHeader,OLE2CT(bstrResponseHeaders),nLen);
Buffer->dwHeadSize =nLen+1;

nLen=lstrlen(OLE2CT(bstrResponseText));
Buffer->lpszResponseBody =(BYTE*) malloc( nLen+1);
ZeroMemory(Buffer->lpszResponseBody,nLen+1);
Buffer->lpszResponseBody=(BYTE*)malloc(nLen+1);
memcpy(Buffer->lpszResponseBody,OLE2CT(bstrResponseText),nLen);

Buffer->dwSize=nLen+1;
while(Buffer->lpszResponseBody[nLen-1]!='>')nLen--;
Buffer->lpszResponseBody[nLen]=0;
}
}
}
catch(...)
{//exception handling
if(Buffer->lpszResponseBody!=NULL)free(Buffer->lpszResponseBody);
if(Buffer->lpszResponseHeader!=NULL)free(Buffer->lpszResponseHeader);
CoUninitialize();
return 1;
}

CoUninitialize();

return 0;
}
masterz 2003-09-06
  • 打赏
  • 举报
回复
void post()
{
CInternetSession session("My Session");
CHttpConnection* pServer = NULL;
CHttpFile* pFile = NULL;
CString ServerName = "webmail.21cn.com";
INTERNET_PORT nPort = 80;
DWORD retcode;
char outBuff[300] = "LoginName=aaa&passwd=xxx&DomainName=21cn.com";//I have test this with my loginname and password
try
{
pServer = session.GetHttpConnection(ServerName,nPort);
pFile = pServer->OpenRequest(CHttpConnection::HTTP_VERB_POST,"/NULL/NULL/NULL/NULL/NULL/SignIn.gen",NULL,1,NULL,NULL,INTERNET_FLAG_EXISTING_CONNECT);
pFile -> AddRequestHeaders("Content-Type: application/x-www-form-urlencoded");
pFile -> AddRequestHeaders("Accept: */*");
pFile -> SendRequest(NULL,0,outBuff,strlen(outBuff)+1);
pFile -> QueryInfoStatusCode(retcode);
// you can read from the file after this......I've just left it out.
for(int i=0;i<10;i++)//read ten line of returned HTML,you need to edit this to use the result
{
CString smsg;
pFile->ReadString(smsg);
AfxMessageBox(smsg);
}
DWORD dwlen=pFile->GetLength();
char buf[1024];
DWORD dwread=pFile->Read(buf,1024);
}
catch (CInternetException * e){};
delete pFile;
delete pServer;
session.Close();
}

3,055

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC HTML/XML
社区管理员
  • HTML/XML社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧