技术交流,DH讲解.

前段时间,和群里面的朋友讨论提交包的时候,结果发现Indy被大家狂批,哈哈,后来有人推荐用WinHttp,查看了下MSDN,WinHttp主要是靠system32目录下面的WinHttp.dll这个文件,而它又有2种用法,一个是直接API,复杂些,但是功能强大,另外一个就是直接使用WinHttpRequest这个ActiveX.

为了使用方便,对WinHttpRequest进行了简单封装,但是感觉不完善,有空补足.还有好多方法没有封装进来,但是留了一个属性property Http:OleVariant read FHttp write FHttp; 这样大家可以直接调用WinHttpRequest.来看看代码:( 直接下载 )

unit utWinHttp;
interface
  SysUtils,Classes,Windows;
const
  request_headers:array[0..14] of string = (
    'Accept','Accept-Encoding','Accept-Language','Cache-Control',
    'CharSet','Connection','Content-Encoding','Content-Language',
    'Content-Type','Date','Expires','From',
    'Referer','UserAgent','Cookie'
const
  WinHttpRequestOption_UserAgentString = $00000000;
  WinHttpRequestOption_URL = $00000001;
  WinHttpRequestOption_URLCodePage = $00000002;
  WinHttpRequestOption_EscapePercentInURL = $00000003;
  WinHttpRequestOption_SslErrorIgnoreFlags = $00000004;
  WinHttpRequestOption_SelectCertificate = $00000005;
  WinHttpRequestOption_EnableRedirects = $00000006;
  WinHttpRequestOption_UrlEscapeDisable = $00000007;
  WinHttpRequestOption_UrlEscapeDisableQuery = $00000008;
  WinHttpRequestOption_SecureProtocols = $00000009;
  WinHttpRequestOption_EnableTracing = $0000000A;
  WinHttpRequestOption_RevertImpersonationOverSsl = $0000000B;
  WinHttpRequestOption_EnableHttpsToHttpRedirects = $0000000C;
  WinHttpRequestOption_EnablePassportAuthentication = $0000000D;
  WinHttpRequestOption_MaxAutomaticRedirects = $0000000E;
  WinHttpRequestOption_MaxResponseHeaderSize = $0000000F;
  WinHttpRequestOption_MaxResponseDrainSize = $00000010;
  WinHttpRequestOption_EnableHttp1_1 = $00000011;
  WinHttpRequestOption_EnableCertificateRevocationCheck = $00000012;
  AutoLogonPolicy_Always = $00000000;
  AutoLogonPolicy_OnlyIfBypassProxy = $00000001;
  AutoLogonPolicy_Never = $00000002;
  SslErrorFlag_UnknownCA = $00000100;
  SslErrorFlag_CertWrongUsage = $00000200;
  SslErrorFlag_CertCNInvalid = $00001000;
  SslErrorFlag_CertDateInvalid = $00002000;
  SslErrorFlag_Ignore_All = $00003300;
  SecureProtocol_SSL2 = $00000008;
  SecureProtocol_SSL3 = $00000020;
  SecureProtocol_TLS1 = $00000080;
  SecureProtocol_ALL = $000000A8;
const
  IStream_GUID:TGUID = '{0000000C-0000-0000-C000-000000000046}';
  TCustomWinHttp = class;
  //请求信息类
  TRequest = class(TPersistent)
  private
    FAccept,FAcceptEncoding,FAcceptLanguage:string;
    FCacheControl,FCharSet,FConnection:string;
    FContentEncoding,FContentLanguage,FContentType:string;
    FDate,FExpires,FFrom:string;
    FReferer,FUserAgent:string;
    FCookie:string;
    FCustomHeader:TStringList;
  public
    constructor Create;
    destructor Destroy; override;
  published
    property Accept:string  read FAccept write FAccept;
    property AcceptEncoding:string read FAcceptEncoding write FAcceptEncoding;
    property AcceptLanguage:string read FAcceptLanguage write FAcceptLanguage;
    property CacheControl:string read FCacheControl write FCacheControl;
    property CharSet:string read FCharSet write FCharSet;
    property Connection:string read FConnection write FConnection;
    property ContentEncoding:string read FContentEncoding write FContentEncoding;
    property ContentLanguage:string read FContentLanguage write FContentLanguage;
    property ContentType:string read FContentType write FContentType;
    property Date:string read FDate write FDate;
    property Expires:string read FExpires write FExpires;
    property From:string read FFrom write FFrom;
    property Referer:string read FReferer write FReferer;
    property UserAgent:string read FUserAgent write FUserAgent;
    property Cookie:string read FCookie write FCookie;
    property CustomHeader:TStringList  read FCustomHeader write FCustomHeader;
  //返回信息类
  TResponse = class(TPersistent)
  private
    FOwner:TCustomWinHttp;
    FHeaderList:TStringList;
    procedure Check;
    function Get_Header(const header_name:string):string;
    function Get_Status:Integer;
    function Get_StatusText:string;
    function Get_ResponseBody:string;
    function Get_HeadersText:string;
  public
    constructor Create(http:TCustomWinHttp);
    destructor Destroy; override;
    property Header[const Name:string]:string  read Get_Header;
    property Status:Integer  read Get_Status;
    property StatusText:string  read Get_StatusText;
    property ResponseBody:string  read Get_ResponseBody;
    property HeadersText:string read Get_HeadersText;
  TCustomWinHttp = class(TComponent)
  private
    FCreated:Boolean;
    FHttp:OleVariant;
    FRequest:TRequest;
    FResponse:TResponse;
    FRequestTime:Integer;
    FOnRequestTimeOut:TNotifyEvent;
    procedure SetRequestHeaders;
    procedure Set_Option(idx:Integer;value:OleVariant);
    function Get_Option(idx:Integer):OleVariant;
    procedure Set_Redirects(B:Boolean);
    function Get_Redirects:Boolean;
    procedure Set_MaxRedirects(N:Integer);
    function Get_MaxRedirects:Integer;
  public
    procedure Abort;
    procedure ClearRequestHeaders;
    function Get(const URL:string):string;overload;
    procedure Get(Const URL:string;res:TStream);overload;
    function Post(const URL:string;Req:TStream):string;overload;
    function Post(const URL,Req:string):string;overload;
    procedure Post(const URL:string;Req,Res:TStream);overload;
    procedure Post(const URL,Req:string;Res:TStream);overload;
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    property Http:OleVariant  read FHttp write FHttp;
    property EnableRedirects:Boolean  read Get_Redirects write Set_Redirects;
    property MaxRedirects:Integer  read Get_MaxRedirects write Set_MaxRedirects;
    property Request:TRequest  read FRequest write FRequest;
    property RequestTime:Integer  read FRequestTime write FRequestTime;
    property OnRequestTimeOut:TNotifyEvent  read FOnRequestTimeOut write FOnRequestTimeOut;
    property Response:TResponse  read FResponse write FResponse;
    property Options[idx:Integer]:OleVariant  read Get_Option write Set_Option;
  TWinHttp = class(TCustomWinHttp)
  published
    property MaxRedirects;
    property EnableRedirects;
    property Request;
    property Response;
    property RequestTime;
    property OnRequestTimeOut;
implementation
  ComObj,AxCtrls,ActiveX,Variants;
{ TResponse }
procedure TResponse.Check;
begin
  if FHeaderList.Count = 0 then
    FHeaderList.Text:=FOwner.FHttp.GetAllResponseHeaders;
constructor TResponse.Create(http:TCustomWinHttp);
begin
  FOwner:=http;
  FHeaderList:=TStringList.Create;
  FHeaderList.NameValueSeparator:=':';
destructor TResponse.Destroy;
begin
  FHeaderList.Free;
  inherited;
function TResponse.Get_Header(const header_name: string): string;
begin
  Check;
  Result:=FHeaderList.Values[header_name];
function TResponse.Get_HeadersText: string;
begin
  Check;
  Result:=FHeaderList.Text;
function TResponse.Get_ResponseBody: string;
begin
  Result:=FOwner.Http.ResponseBody;
function TResponse.Get_Status: Integer;
begin
  Result:=FOwner.Http.Status;
function TResponse.Get_StatusText: string;
begin
  Result:=FOwner.Http.StatusText;
{ TRequest }
constructor TRequest.Create;
begin
  inherited;
  FCustomHeader:=TStringList.Create;
destructor TRequest.Destroy;
begin
  FCustomHeader.Free;
  inherited;
{ TCustomWinHttp }
procedure TCustomWinHttp.Abort;
begin
  if FCreated then
    FHttp.Abort();
procedure TCustomWinHttp.ClearRequestHeaders;
  I,base: Integer;
begin
  base := Integer(FRequest);
  for I := 0 to 14 do
    PDWORD(base + 4 * (I+1))^:=0;
  FRequest.CustomHeader.Clear;
constructor TCustomWinHttp.Create(AOwner: TComponent);
begin
  inherited;
  FRequest:=TRequest.Create;
  FRequest.FCustomHeader.NameValueSeparator:=':';
  FResponse:=TResponse.Create(Self);
    FCreated:=False;
    FHttp:=CreateOleObject('WinHttp.WinHttpRequest.5.1');
    FCreated:=True;
  except
    raise Exception.Create('创建WinHttp失败');
  FRequestTime:=4000;
destructor TCustomWinHttp.Destroy;
begin
  Abort;
  FHttp:=0;
  FResponse.Free;
  FRequest.Free;
  inherited;
function TCustomWinHttp.Get(const URL: string): string;
  ss:TStringStream;
begin
  Result:='';
  ss:=TStringStream.Create;
    Get(URL,SS);
    Result:=ss.DataString;
  finally
    ss.Free;
procedure TCustomWinHttp.Get(const URL: string; res: TStream);
  iu:IUnknown;
  os:TOlestream;
  s:IStream;
  p:OleVariant;
  w:Word;
begin
  Assert(res<>Nil);
  if Not FCreated then
    Exit;
  //清除已经有的header
  FResponse.FHeaderList.Clear;
    FHttp.Open('GET',URL,False);
    SetRequestHeaders;
    FHttp.Send(varEmpty);
    if Not FHttp.WaitForResponse(FRequestTime) then
    begin
      FHttp.Abort;
      if Assigned(FOnRequestTimeOut) then
        FOnRequestTimeOut(Self);
      Exit;
    P:=FHttp.ResponseStream ;
    W:=VarType(P);
    if w = varUnknown then
    begin
      iu:=IUnknown(P);
      iu.QueryInterface(IStream_GUID,s);
    if s=nil then
      Exit;
    res.Position:=0;
    os:=TOleStream.Create(s);
      os.Position:=0;
      res.CopyFrom(os,os.Size)
    finally
      os.Free
  except
function TCustomWinHttp.Get_MaxRedirects: Integer;
begin
  Result:=Get_Option(WinHttpRequestOption_MaxAutomaticRedirects) ;
function TCustomWinHttp.Get_Option(idx: Integer): OleVariant;
begin
  Result:=FHttp.Option[idx];
function TCustomWinHttp.Get_Redirects: Boolean;
begin
  Result:=FHttp.Option[WinHttpRequestOption_EnableRedirects];
function TCustomWinHttp.Post(const URL, Req: string): string;
  ss:TStringStream;
begin
  Result:='';
  SS:=TStringStream.Create;
    Post(URL,Req,SS);
    Result:=ss.DataString;
  finally
    ss.Free;
function TCustomWinHttp.Post(const URL: string; Req: TStream): string;
  ss:TStringStream;
  S:string;
begin
  Assert(Req<>nil);
  ss:=TStringStream.Create;
    Req.Position:=0;
    ss.CopyFrom(Req,Req.Size);
    S:=ss.DataString;
    ss.Clear;
    Post(URL,S,ss);
    Result:=ss.DataString;
  finally
    ss.Free;
procedure TCustomWinHttp.Post(const URL: string; Req, Res: TStream);
  ss:TStringStream;
  S:string;
begin
  Assert(Req<>nil);
  ss:=TStringStream.Create;
    Req.Position:=0;
    ss.CopyFrom(Req,Req.Size);
    S:=ss.DataString;
    Post(URL,s,Res)
  finally
    ss.Free;
procedure TCustomWinHttp.SetRequestHeaders;
  I,dx,base: Integer;
  S:string;
begin
  base:=Integer(FRequest);
  for I := 0 to 14 do
  begin
    dx:=base + 4 * (I + 1);
    s:=PString(dx)^;
    if s<>'' then
      FHttp.SetRequestHeader(request_headers[I],S);
  for I := 0 to FRequest.CustomHeader.Count - 1 do
    FHttp.SetRequestHeader(FRequest.CustomHeader.Names[I],
            FRequest.CustomHeader.ValueFromIndex[I]
procedure TCustomWinHttp.Set_MaxRedirects(N: Integer);
begin
  Set_Option(WinHttpRequestOption_MaxAutomaticRedirects,N);
procedure TCustomWinHttp.Set_Option(idx: Integer; value: OleVariant);
begin
  FHttp.Option[idx]:=value;
procedure TCustomWinHttp.Set_Redirects(B: Boolean);
begin
  Set_Option(WinHttpRequestOption_EnableRedirects,B);
procedure TCustomWinHttp.Post(const URL, Req: string; Res: TStream);
  s:IStream;
  os:TOleStream;
  p:OleVariant;
begin
  Assert(Res<>Nil);
  if Not FCreated then
    Exit;
  FResponse.FHeaderList.Clear;
    FHttp.Open('POST',URL,False);
    SetRequestHeaders;
    FHttp.SetRequestHeader('Content-Length',IntToStr(Length(Req)));
    FHttp.Send(Req);
    if Not FHttp.WaitForResponse(FRequestTime) then
    begin
      FHttp.Abort;
      if Assigned(FOnRequestTimeOut) then
        FOnRequestTimeOut(Self);
      Exit;
    P:=FHttp.ResponseStream;
    if VarType(P) = varUnknown then
      IUnknown(P).QueryInterface(IStream_GUID,S);
    if s=nil then
      Exit;
    os:=TOleStream.Create(s);
      Res.Position:=0;
      os.Position:=0;
      Res.CopyFrom(os,os.Size);
    finally
      os.Free;
  except
 


简单用法,表单提交来登录人人网:

TForm3 = class(TForm) btn1: TButton; procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure btn1Click(Sender: TObject); private { Private declarations } Http:TWinHttp; public { Public declarations } Form3: TForm3; implementation {$R *.dfm} procedure TForm3.btn1Click(Sender: TObject); s:string; begin //清空之前的header Http.ClearRequestHeaders; //设置自己的header ,两种方法都可以 //POST时候这个必须设置成这样 Http.Request.ContentType:='application/x-www-form-urlencoded'; // Http.Request.CustomHeader.Add('Content-Type: application/x-www-form-urlencoded'); S:=Http.Post('http://www.renren.com/PLogin.do', 'email=huangjacky@163.com&password=密码&origURL=http%3A%2F%2Fwww.renren.com%2FHome.do&domain=renren.com'); //html代码 ShowMessage(S); //返回的header ShowMessage(Http.Response.HeadersText); ShowMessageFmt('Code:%D,Text:%S', [Http.Response.Status,Http.Response.StatusText] procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction); begin Http.Free; procedure TForm3.FormCreate(Sender: TObject); begin Http:=TWinHttp.Create(Self); //禁止转向 Http.EnableRedirects:=False;

再来个下载文件的例子:

procedure TForm3.btn2Click(Sender: TObject);
  S:TFileStream;
begin
  s:=TFileStream.Create('C:\11.rar',fmCreate);
  Http.Get('http://files.cnblogs.com/huangjacky/Delphi.Distiller.v1.83.rar',s);
  s.Free;
 


我是DH,吃饭去了

转载于:https://www.cnblogs.com/huangjacky/archive/2009/12/30/1635830.html

技术交流,DH讲解.前段时间,和群里面的朋友讨论提交包的时候,结果发现Indy被大家狂批,哈哈,后来有人推荐用WinHttp,查看了下MSDN,WinHttp主要是靠system32目录下面的WinHttp.dll这个文件,而它又有2种用法,一个是直接API,复杂些,但是功能强大,另外一个就是直接使用WinHttpRequest这个ActiveX.为了使用方便,对WinHttpR... 一、JavaScript发请求(HttpRequest)给delphi三层服务器响应(Response) 01、截自《JavaScript中发出HTTP请求最常用的方法》https://www.jb51.net/article/143683.htm 01.1、Ajax方法 (1)、初始化一个新的XMLHttpRequest()方法; (2)、open()方法将HTT...     IDHttp和WebBrowser一样,都可以实现抓取远端网页的功能,但是http方式更快、更节约资源,缺点是需要手动维护cook,连接等       IDHttp的创建,需要引入IDHttp       procedure InitHttp();       begin  
WinHttp.WinHttpRequest.5.1中文参考手册(详解),详细介绍了该组件的方法、属性等的用法以及参数的解释。。。 例:方法调用格式: 〈无返回值〉 对象.方法 ("SetProxy"proxySetting,ProxyServer,BypassList) 参数的名称为“ProxySetting”,类型为“整数型”。===代理服务器设置 参数的名称为“ProxyServer”,类型为“变体型”,可以被省略。===代理服务器 参数的名称为“BypassList”,类型为“变体型”,可以被省略。 ===忽略列表 解释:Specify proxy configuration
由于贪方便,用idhttp控件实现POST部分。结果发现频繁提交的时候总产生10054 等N多不可控错误。遂想换其它方法。百度找了下。基本都是靠webbrowser 、idhttp等控件提交的。于是,摸索着用 wininet.dll的api自己实现了一个webpost。效果不错。特地贴上方便自己以后检索。 function WebPagePost(sURL,sPostData:st
To ease the configuration of proxy settings, WinHTTP 5.1 implements the Web Proxy Auto-Discovery (WPAD) protocol, also known as autoproxy. Overview of AutoProxy Applications and components that use
VB中使用WinHTTPRequest下载文件十分简单,只需几行代码即可完成。 首先,我们需要创建一个WinHTTPRequest对象,并设置其相关属性。然后使用Open方法指定下载文件的URL,并使用Send方法发送下载请求。 接着,我们需要创建一个文件流对象,用于保存下载的文件内容。然后使用WinHTTPRequest的ResponseBody属性获取下载的文件内容,并将其写入文件流。 最后,关闭文件流,并释放WinHTTPRequest对象。 下面是一个简单的示例代码: ```vb Dim http As New WinHttp.WinHttpRequest Dim fileStream As Object ' 设置WinHTTPRequest的属性 http.Option(WinHttpRequestOption_EnableRedirects) = True http.Option(WinHttpRequestOption_SslErrorIgnoreFlags) = &H3300 ' 发送下载请求 http.Open "GET", "http://example.com/samplefile.txt", False http.Send ' 创建保存下载内容的文件流 Set fileStream = CreateObject("ADODB.Stream") fileStream.Type = 1 ' 二进制 ' 将下载的文件内容写入文件流 fileStream.Open fileStream.Write http.ResponseBody fileStream.SaveToFile "C:\Downloads\samplefile.txt" fileStream.Close ' 释放WinHTTPRequest对象 Set http = Nothing 上述代码假设我们要下载的文件是位于`http://example.com/samplefile.txt`,并将其保存在`C:\Downloads\samplefile.txt`路径下。你可以将代码中的URL和保存路径修改为你需要的文件。 以上就是使用VB的WinHTTPRequest下载文件的简单示例,希望能够对你有所帮助! ### 回答2: 使用VBScript中的WinHttpRequest对象可以简单地实现文件下载。下面是一个使用WinHttpRequest对象下载文件的简单示例: ```vbscript Dim WinHttpReq ' 声明WinHttpRequest对象 Dim url, fileName ' 定义下载文件的URL和保存的文件名 url = "http://example.com/file.pdf" ' 要下载的文件的URL fileName = "C:\Downloads\file.pdf" ' 要保存的文件路径 ' 创建WinHttpRequest对象 Set WinHttpReq = CreateObject("WinHttp.WinHttpRequest.5.1") ' 发送GET请求以下载文件 WinHttpReq.Open "GET", url, False WinHttpReq.Send ' 检查响应状态 If WinHttpReq.Status = 200 Then ' 保存下载的文件 Set stream = CreateObject("ADODB.Stream") stream.Open stream.Type = 1 stream.Write WinHttpReq.ResponseBody stream.SaveToFile fileName, 2 stream.Close MsgBox "文件下载完成。" MsgBox "下载文件失败。" End If 上述代码首先声明了`WinHttpRequest`对象和要下载的文件的URL以及保存的文件路径。然后创建`WinHttpRequest`对象,使用`Open`方法发送GET请求以下载文件,并使用`Send`方法发送该请求。 然后,我们检查响应状态是否为200,即请求是否成功。如果成功,我们通过创建`ADODB.Stream`对象来保存下载的文件,并使用`SaveToFile`方法将响应的`ResponseBody`写入文件流中,最后关闭流。 最后,我们使用`MsgBox`显示一个消息框,告诉用户文件是否成功下载。 请注意,下载的文件应该具有正确的权限,并且要保存的文件路径必须是存在且可写的。 ### 回答3: 在使用VB的WinHttpRequest对象下载文件时,可以按照以下步骤进行操作: 1. 首先,创建一个WinHttpRequest对象,并设置其相关属性: Dim http As WinHttpRequest Set http = New WinHttpRequest http.Option(WinHttpRequestOption_EnableRedirects) = True http.Option(WinHttpRequestOption_SslErrorIgnoreFlags) = &H3300 2. 然后,使用Open方法指定请求的URL: http.Open "GET", "http://example.com/file.txt", False 3. 发送请求并获取响应: http.Send 4. 检查请求是否成功,并将响应保存到本地文件: If http.Status = 200 Then Dim adodbStream As Object Set adodbStream = CreateObject("ADODB.Stream") adodbStream.Open adodbStream.Type = 1 '二进制 adodbStream.Write http.ResponseBody adodbStream.SaveToFile "C:\download\file.txt", 2 '保存到本地文件 adodbStream.Close Set adodbStream = Nothing End If 以上是通过VB的WinHttpRequest对象进行文件下载的基本步骤。需要注意的是,下载文件的URL必须是有效可访问的,并且本地保存文件的路径需要存在且有写入权限。此外,还可以根据具体需求添加错误处理、进度监测等功能。