⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unthttpconnection.pas

📁 用于模拟GETPOST方法发送HTTP请求并取得数据.rar
💻 PAS
字号:
unit untHttpConnection;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdBaseComponent, IdComponent, IdTCPServer, StdCtrls,winsock,
  ComCtrls, ExtCtrls,untHttpHeaderObj;

type
  TMyHttpData = class
  public
    dataHttpHeader:String;
    dataHttpContent:String;
  end;

  const GetMethod = 12548;
  const PostMethod = 15467;
  function getHttpData(Server:String;Port:integer;Url:String;var CookieVal:TStringList;Method:integer = GetMethod;RequestData:String=''):TMyHttpData;

  function getHttpDataByGetMethod(Server:String;Port:integer;Url:String;var CookieVal:TStringList):String;
  function getHttpDataByPostMethod(Server:String;Port:integer;Url:String;var CookieVal:TStringList;RequestData:String):String;

implementation

function getHttpData(Server:String;Port:integer;Url:String;var CookieVal:TStringList;Method:integer = GetMethod;RequestData:String=''):TMyHttpData;
var
  PageData:String;
  i:integer;
begin
  Result := TMyHttpData.Create;
  PageData := '';
  if Method = GetMethod then
    PageData := getHttpDataByGetMethod(Server,Port,Url,CookieVal)
  else
    PageData := getHttpDataByPostMethod(Server,Port,Url,CookieVal,RequestData);
  i := pos(#13#10#13#10,PageData);
  if i>0 then
  begin
    Result.dataHttpHeader := Copy(PageData,1,i);
    Result.dataHttpContent := Copy(PageData,i+4,Length(PageData)-i+4+1);
  end
  else begin
    Result.dataHttpHeader := '';
    Result.dataHttpContent := '';
  end;
end;

function getHttpDataByGetMethod(Server:String;Port:integer;Url:String;var CookieVal:TStringList):String;
var
  len,s:integer;
  name:sockaddr_in;
  he:PHostEnt;
  buf:array[0..1023]of char;
  str,data:string;
  wsd:WSADATA;
  i:integer;
begin
  WSAStartup($101,wsd);
  s:=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
  he:=gethostbyname(PChar(Server));
  if he=nil then
    Raise Exception.Create('使用Sock连接异常或是指定服务器有误!');

  FillChar(name,sizeof(name),0);
  name.sin_family:=AF_INET;
  name.sin_port:=htons(Port);
  name.sin_addr.S_addr:=PDWORD(PDWORD(he.h_addr)^)^;
  connect(s,name,sizeof(name));
  str := 'GET /'+ Url +' HTTP/1.1'#13#10;
  str := str + 'Referer: http://' + Server;
  if Port<>80 then
    str := str + ':' + IntToStr(Port);
  str := str + '/' + Url + #13#10;
  str := str + 'User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0; MyIE 3.01)'#13#10;
  str := str + 'Host: ' + Server;
  if Port<>80 then
    str := str + ':' + IntToStr(Port);
  str := str + ''#13#10;
  str := str + 'Connection: Close'#13#10;
  str := str + 'Cache-Control: no-cache'#13#10;

  for i := 0 to CookieVal.Count-1 do
  begin
    str := str + 'Cookie: '+ CookieVal.Strings[i] + #13#10;
  end;

  str := str + #13#10;
  send(s,PChar(str)^,Length(str),0);
  while true do
  begin
    len:=recv(s,buf,sizeof(buf),0);
    if len<1 then
      break;
    SetString(str,buf,len);
    data:=data+str;
  end;
  closesocket(s);
  WSACleanup();
  Result := data;
end;

function getHttpDataByPostMethod(Server:String;Port:integer;Url:String;var CookieVal:TStringList;RequestData:String):String;
var
  len,s:integer;
  name:sockaddr_in;
  he:PHostEnt;
  buf:array[0..1023]of char;
  str,data:string;
  wsd:WSADATA;
  i:integer;
begin
  WSAStartup($101,wsd);
  s:=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
  he:=gethostbyname(PChar(Server));
  if he=nil then
    Raise Exception.Create('使用Sock连接异常或是指定服务器有误!');

  FillChar(name,sizeof(name),0);
  name.sin_family:=AF_INET;
  name.sin_port:=htons(Port);
  name.sin_addr.S_addr:=PDWORD(PDWORD(he.h_addr)^)^;
  connect(s,name,sizeof(name));
  str := 'POST /'+ Url +' HTTP/1.1'#13#10;
  str := str + 'Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword */*'#13#10;
  str := str + 'Referer: http://' + Server;
  if Port<>80 then
    str := str + ':' + IntToStr(Port);
  str := str + '/' + Url + #13#10;
  str := str + 'Accept-Language: zh-cn'#13#10;
  str := str + 'Content-Type: application/x-www-form-urlencoded..Accept-Encoding: gzip, deflate'#13#10;
  str := str + 'User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0; MyIE 3.01)'#13#10;
  str := str + 'Host: ' + Server;
  if Port<>80 then
    str := str + ':' + IntToStr(Port);
  str := str + ''#13#10;
  str := str + 'Content-Length: ' + IntToStr(Length(RequestData)) + #13#10;
  str := str + 'Connection: Keep-Alive'#13#10;

  for i := 0 to CookieVal.Count-1 do
  begin
    str := str + 'Cookie: '+ CookieVal.Strings[i] + #13#10;
  end;
  str := str + 'Cache-Control: no-cache'#13#10#13#10;
  str := str + RequestData + #13#10#13#10;
  str := str + #13#10;
  send(s,PChar(str)^,Length(str),0);
  while true do
  begin
    len:=recv(s,buf,sizeof(buf),0);
    if len<1 then
      break;
    SetString(str,buf,len);
    data:=data+str;
  end;
  closesocket(s);
  WSACleanup();
  Result := data;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -