模拟浏览器发送HTTP请求的两个函数(VC/VB)

本文介绍了一个使用Wininet API模拟浏览器发送HTTP请求的C++函数。该函数可以发起GET或POST请求,并接收服务器响应。通过实际代码示例展示了如何访问网页内容并保存到本地。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <afxwin.h>
#include 
<stdio.h>
#include 
<windows.h>
#include 
"Wininet.h"

#pragma comment(lib,"Wininet.lib")

//模拟浏览器发送HTTP请求函数
CString HttpRequest(char * lpHostName,short sPort,char * lpUrl,char * lpMethod,char * lpPostData,int nPostDataLen)
{
    HINTERNET hInternet,hConnect,hRequest;
    BOOL bRet;CString strResponse;

    hInternet 
= InternetOpen("User-Agent",INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);
    
if(!hInternet)
        
goto Ret0;

    hConnect 
= InternetConnect(hInternet,lpHostName,sPort,NULL,"HTTP/1.1",INTERNET_SERVICE_HTTP,0,0);
    
if(!hConnect)
        
goto Ret0;

    hRequest 
= HttpOpenRequest(hConnect,lpMethod,lpUrl,"HTTP/1.1",NULL,NULL,INTERNET_FLAG_RELOAD,0);
    
if(!hRequest)
        
goto Ret0;

    
//bRet = HttpAddRequestHeaders(hRequest,"Content-Type: application/x-www-form-urlencoded",Len(FORMHEADERS),HTTP_ADDREQ_FLAG_REPLACE | HTTP_ADDREQ_FLAG_ADD);
    
//if(!bRet)
        
//goto Ret0;

    bRet 
= HttpSendRequest(hRequest,NULL,0,lpPostData,nPostDataLen);

    
while(TRUE)
    {
        
char cReadBuffer[4096];
        unsigned 
long lNumberOfBytesRead;
        bRet 
= InternetReadFile(hRequest,cReadBuffer,sizeof(cReadBuffer) - 1,&lNumberOfBytesRead);
        
if(!bRet || !lNumberOfBytesRead)
            
break;
        cReadBuffer[lNumberOfBytesRead] 
= 0;
        strResponse 
= strResponse + cReadBuffer;
    }

Ret0:
    
if(hRequest)
        InternetCloseHandle(hRequest);
    
if(hConnect)
        InternetCloseHandle(hConnect);
    
if(hInternet)
        InternetCloseHandle(hInternet);

    
return strResponse;
}

void main() 

    
//CString strResponse = HttpRequest("translate.google.com",80,"/translate_t?langpair=en|zh-CN","POST","hl=zh-CN&ie=UTF-8&text=this is me&langpair=en|zh-CN",strlen("hl=zh-CN&ie=UTF-8&text=this is me&langpair=en|zh-CN"));
    CString strResponse = HttpRequest("www.hao123.com",80,NULL,"GET",NULL,0);
    FILE 
* fp = fopen("C:/123.htm","wb");
    fwrite(strResponse,strResponse.GetLength(),
1,fp);
    fclose(fp);
    ::MessageBox(NULL,strResponse,
"123",0);
}
 
Option Explicit
Public Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" (ByVal sAgent As StringByVal lAccessType As LongByVal sProxyName As StringByVal sProxyBypass As StringByVal lFlags As LongAs Long
Public Declare Function InternetCloseHandle Lib "wininet.dll" (ByVal hInternetHandle As LongAs Boolean
Public Declare Function InternetConnect Lib "wininet.dll" Alias "InternetConnectA" (ByVal hInternetSession As LongByVal lpszServerName As StringByVal nProxyPort As IntegerByVal lpszUsername As StringByVal lpszPassword As StringByVal dwService As LongByVal dwFlags As LongByVal dwContext As LongAs Long
Public Declare Function HttpOpenRequest Lib "wininet.dll" Alias "HttpOpenRequestA" (ByVal hInternetSession As LongByVal lpszVerb As StringByVal lpszObjectName As StringByVal lpszVersion As StringByVal lpszReferer As StringByVal lpszAcceptTypes As LongByVal dwFlags As LongByVal dwContext As LongAs Long
Public Declare Function HttpAddRequestHeaders Lib "wininet.dll" Alias "HttpAddRequestHeadersA" (ByVal hHttpRequest As LongByVal sHeaders As StringByVal lHeadersLength As LongByVal lModifiers As LongAs Integer
Public Declare Function HttpSendRequest Lib "wininet.dll" Alias "HttpSendRequestA" (ByVal hHttpRequest As LongByVal sHeaders As StringByVal lHeadersLength As LongByVal sOptional As StringByVal lOptionalLength As LongAs Boolean
Public Declare Function InternetReadFile Lib "wininet.dll" (ByVal hFile As LongByVal sBuffer As StringByVal lNumBytesToRead As Long, lNumberOfBytesRead As LongAs Integer

Public Const INTERNET_OPEN_TYPE_PRECONFIG = 0
Public Const INTERNET_DEFAULT_HTTP_PORT = 80
Public Const INTERNET_SERVICE_HTTP = 3
Public Const INTERNET_FLAG_RELOAD = &H80000000
Public Const HTTP_ADDREQ_FLAG_REPLACE = &H80000000
Public Const HTTP_ADDREQ_FLAG_ADD = &H20000000

'模拟浏览器发送HTTP请求协议函数
Function HttpRequest(strHostName As String, intPort As Integer, strUrl As String, strMethod As String, strPostData As StringByVal lngPostDataLen As LongAs String
    
Dim hInternet As Long, hConnect As Long, hRequest As Long
    
Dim strBuffer As String, lngNumberOfBytesRead As Long, strResponse As String
    
Dim blnRet As Boolean
    
    HttpRequest 
= "" '初始化函数返回值
    
    
'打开一个Session会话
    hInternet = InternetOpen("MyAgent", INTERNET_OPEN_TYPE_PRECONFIG, vbNullString, vbNullString, 0)
    
If hInternet = 0 Then
        
MsgBox "hInternetOpen函数调用失败!"
        
GoTo Ret0
    
End If
    
    
'连接服务器
    hConnect = InternetConnect(hInternet, strHostName, intPort, vbNullString, "HTTP/1.1", INTERNET_SERVICE_HTTP, 00)
    
If hConnect = 0 Then
        
MsgBox "InternetConnect函数调用失败!"
        
GoTo Ret0
    
End If
     
    
'创建一个请求
    hRequest = HttpOpenRequest(hConnect, strMethod, strUrl, "HTTP/1.1", vbNullString, 0, INTERNET_FLAG_RELOAD, 0)
    
If hRequest = 0 Then
        
MsgBox "HttpOpenRequest函数调用失败!"
        
GoTo Ret0
    
End If
    
    blnRet 
= HttpSendRequest(hRequest, vbNullString, 0, strPostData, lngPostDataLen)
    
If blnRet = False Then
        
MsgBox "HttpSendRequest函数调用失败!"
        
GoTo Ret0
    
End If
    
    
Do While True
        strBuffer 
= String(40960)
        blnRet 
= InternetReadFile(hRequest, strBuffer, Len(strBuffer), lngNumberOfBytesRead)
        strResponse 
= strResponse & Left(strBuffer, lngNumberOfBytesRead)
        
If blnRet = False Or Not CBool(lngNumberOfBytesRead) Then Exit Do
    
Loop

Ret0:
    
If hRequest Then Call InternetCloseHandle(hRequest)
    
If hConnect Then Call InternetCloseHandle(hConnect)
    
If hInternet Then Call InternetCloseHandle(hInternet)
    
    HttpRequest 
= strResponse
End Function
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值