zoukankan      html  css  js  c++  java
  • wininet进行网页的post与get方法。

    uses Winapi.Wininet
    
    function WebPagePost(sURL,sPostData:AnsiString):AnsiString;stdcall;
    const
      RequestMethod = 'POST';
      HTTP_VERSION  = 'HTTP/1.1';  //HTTP版本 我抓包看过 HTTP/1.0 HTTP/1.1。尚未仔细了解其区别。按MSDN来写的。留空默认是1.0
    var
      HttpsFlag:Boolean;
      dwSize:DWORD;
      dwFileSize: Int64;
      dwBytesRead,dwReserved:DWORD;
      hInte,hConnection,hRequest:HInternet;
      ContentSize:array[1..1024] of Char;
      HostPort:Integer;
      HostName,FileName,sHeader:String;
      Contents:PAnsiChar;
      procedure ParseURL(URL: string;var HostName,FileName:string;var HostPort:Integer;var httpsFlag:Boolean);
      var
        i,p,k: DWORD;
        function StrToIntDef(const S: string; Default: Integer): Integer;
        var
          E: Integer;
        begin
          Val(S, Result, E);
          if E <> 0 then Result := Default;
        end;
      begin
        if lstrcmpi('http://',PChar(Copy(URL,1,7))) = 0 then System.Delete(URL, 1, 7);
        if lstrcmpi('https://',PChar(Copy(URL,1,8))) = 0 then
        begin
          System.Delete(URL, 1, 8);
          HttpsFlag:=True;
        end else HttpsFlag:=False;
        HostName := URL;
        FileName := '/';
        if HttpsFlag then
          HostPort := INTERNET_DEFAULT_HTTPS_PORT
        else
          HostPort := INTERNET_DEFAULT_HTTP_PORT;
        i := Pos('/', URL);
        if i <> 0 then
        begin
          HostName := Copy(URL, 1, i-1);
          FileName := Copy(URL, i, Length(URL) - i + 1);
        end;
        p:=pos(':',HostName);
        if p <> 0 then
        begin
          k:=Length(HostName)-p;
          if HttpsFlag then
            HostPort:=StrToIntDef(Copy(HostName,p+1,k),INTERNET_DEFAULT_HTTPS_PORT)
          else
            HostPort:=StrToIntDef(Copy(HostName,p+1,k),INTERNET_DEFAULT_HTTP_PORT);
          Delete(HostName,p,k+1);
        end;
      end;
    begin
      Result := '';
      dwFileSize :=0;
      ParseURL(sURL,HostName,FileName,HostPort,HttpsFlag);
      // 函数原型见 http://technet.microsoft.com/zh-cn/subscriptions/aa385096(v=vs.85).aspx
      hInte := InternetOpen('', //UserAgent
                               INTERNET_OPEN_TYPE_PRECONFIG,nil,nil,0);
      if hInte<>nil then
      begin
        hConnection := InternetConnect(hInte,   // 函数原型见 http://technet.microsoft.com/zh-cn/query/ms909418
                                       PChar(HostName),
                                       HostPort,
                                       nil,
                                       nil,
                                       INTERNET_SERVICE_HTTP,
                                       0,
                                       0);
        if hConnection<>nil then
        begin
          if HttpsFlag then
    
          hRequest := HttpOpenRequest(hConnection,  // 函数原型见 http://msdn.microsoft.com/zh-cn/library/aa917871
                                      PChar(RequestMethod),
                                      PChar(FileName),
                                      HTTP_VERSION,
                                      '', //Referrer 来路
                                      nil,//AcceptTypes 接受的文件类型 TEXT/HTML */*
                                      INTERNET_FLAG_NO_CACHE_WRITE or
                                      INTERNET_FLAG_RELOAD or INTERNET_FLAG_SECURE,
                                      0)
          else
          hRequest := HttpOpenRequest(hConnection,  // 函数原型见 http://msdn.microsoft.com/zh-cn/library/aa917871
                                      PChar(RequestMethod),
                                      PChar(FileName),
                                      HTTP_VERSION,
                                      '', //Referrer 来路
                                      nil,//AcceptTypes 接受的文件类型 TEXT/HTML */*
                                      INTERNET_FLAG_NO_CACHE_WRITE or
                                      INTERNET_FLAG_RELOAD,
                                      0);
          if hRequest<>nil then
          begin
            sHeader := 'Content-Type: application/x-www-form-urlencoded' + #13#10;
        //    +'CLIENT-IP: 216.13.23.33'+#13#10
        //    'X-FORWARDED-FOR: 216.13.23.33' + #13#10+; 伪造代理IP
    
            // 函数原型见 http://msdn.microsoft.com/zh-cn/library/aa384227(v=VS.85)
            HttpAddRequestHeaders(hRequest,PChar(sHeader),
                                  Length(sHeader),
                                  HTTP_ADDREQ_FLAG_ADD or HTTP_ADDREQ_FLAG_REPLACE);
            // 函数原型见 http://msdn.microsoft.com/zh-cn/library/windows/desktop/aa384247(v=vs.85).aspx
            if HttpSendRequest(hRequest,nil,0,PChar(sPostData),Length(sPostData)) then
            begin
              dwReserved:=0;
              dwSize:=SizeOf(ContentSize);
              // 函数原型 http://msdn.microsoft.com/zh-cn/subscriptions/downloads/aa384238.aspx
              if HttpQueryInfo(hRequest,HTTP_QUERY_CONTENT_LENGTH,@ContentSize,dwSize,dwReserved) then
              begin
                dwFileSize:=StrToInt(ContentSize);
                GetMem(Contents, dwFileSize);
                InternetReadFile(hRequest,Contents,dwFileSize,dwBytesRead);
                Result:=StrPas(Contents);
                FreeMem(Contents);
              end;
            end;
          end;
          InternetCloseHandle(hRequest);
        end;
        InternetCloseHandle(hConnection);
      end;
      InternetCloseHandle(hInte);
    end;
    
    function WebPageGet(sURL:AnsiString):AnsiString;stdcall;
    const
      RequestMethod = 'GET';
      HTTP_VERSION  = 'HTTP/1.1';  //HTTP版本 我抓包看过 HTTP/1.0 HTTP/1.1。尚未仔细了解其区别。按MSDN来写的。留空默认是1.0
    var
      HttpsFlag:Boolean;
      dwSize:DWORD;
      dwFileSize: Int64;
      dwBytesRead,dwReserved:DWORD;
      hInte,hConnection,hRequest:HInternet;
      ContentSize:array[1..1024] of Char;
      HostPort:Integer;
      HostName,FileName,sHeader:String;
      Contents:PAnsiChar;
      procedure ParseURL(URL: string;var HostName,FileName:string;var HostPort:Integer;var httpsFlag:Boolean);
      var
        i,p,k: DWORD;
        function StrToIntDef(const S: string; Default: Integer): Integer;
        var
          E: Integer;
        begin
          Val(S, Result, E);
          if E <> 0 then Result := Default;
        end;
      begin
        if lstrcmpi('http://',PChar(Copy(URL,1,7))) = 0 then System.Delete(URL, 1, 7);
        if lstrcmpi('https://',PChar(Copy(URL,1,8))) = 0 then
        begin
          System.Delete(URL, 1, 8);
          HttpsFlag:=True;
        end else HttpsFlag:=False;
        HostName := URL;
        FileName := '/';
        if HttpsFlag then
          HostPort := INTERNET_DEFAULT_HTTPS_PORT
        else
          HostPort := INTERNET_DEFAULT_HTTP_PORT;
        i := Pos('/', URL);
        if i <> 0 then
        begin
          HostName := Copy(URL, 1, i-1);
          FileName := Copy(URL, i, Length(URL) - i + 1);
        end;
        p:=pos(':',HostName);
        if p <> 0 then
        begin
          k:=Length(HostName)-p;
          if HttpsFlag then
            HostPort:=StrToIntDef(Copy(HostName,p+1,k),INTERNET_DEFAULT_HTTPS_PORT)
          else
            HostPort:=StrToIntDef(Copy(HostName,p+1,k),INTERNET_DEFAULT_HTTP_PORT);
          Delete(HostName,p,k+1);
        end;
      end;
    begin
      Result := '';
      dwFileSize :=0;
      ParseURL(sURL,HostName,FileName,HostPort,HttpsFlag);
      // 函数原型见 http://technet.microsoft.com/zh-cn/subscriptions/aa385096(v=vs.85).aspx
      hInte := InternetOpen('', //UserAgent
                               INTERNET_OPEN_TYPE_PRECONFIG,nil,nil,0);
      if hInte<>nil then
      begin
        hConnection := InternetConnect(hInte,   // 函数原型见 http://technet.microsoft.com/zh-cn/query/ms909418
                                       PChar(HostName),
                                       HostPort,
                                       nil,
                                       nil,
                                       INTERNET_SERVICE_HTTP,
                                       0,
                                       0);
        if hConnection<>nil then
        begin
          if HttpsFlag then
    
          hRequest := HttpOpenRequest(hConnection,  // 函数原型见 http://msdn.microsoft.com/zh-cn/library/aa917871
                                      PChar(RequestMethod),
                                      PChar(FileName),
                                      HTTP_VERSION,
                                      '', //Referrer 来路
                                      nil,//AcceptTypes 接受的文件类型 TEXT/HTML */*
                                      INTERNET_FLAG_NO_CACHE_WRITE or
                                      INTERNET_FLAG_RELOAD or INTERNET_FLAG_SECURE,
                                      0)
          else
          hRequest := HttpOpenRequest(hConnection,  // 函数原型见 http://msdn.microsoft.com/zh-cn/library/aa917871
                                      PChar(RequestMethod),
                                      PChar(FileName),
                                      HTTP_VERSION,
                                      '', //Referrer 来路
                                      nil,//AcceptTypes 接受的文件类型 TEXT/HTML */*
                                      INTERNET_FLAG_NO_CACHE_WRITE or
                                      INTERNET_FLAG_RELOAD,
                                      0);
          if hRequest<>nil then
          begin
            sHeader := 'Content-Type: application/x-www-form-urlencoded' + #13#10;
        //    +'CLIENT-IP: 216.13.23.33'+#13#10
        //    'X-FORWARDED-FOR: 216.13.23.33' + #13#10+; 伪造代理IP
    
            // 函数原型见 http://msdn.microsoft.com/zh-cn/library/aa384227(v=VS.85)
            HttpAddRequestHeaders(hRequest,PChar(sHeader),
                                  Length(sHeader),
                                  HTTP_ADDREQ_FLAG_ADD or HTTP_ADDREQ_FLAG_REPLACE);
            // 函数原型见 http://msdn.microsoft.com/zh-cn/library/windows/desktop/aa384247(v=vs.85).aspx
            if HttpSendRequest(hRequest,nil,0,nil,0) then
            begin
              dwReserved:=0;
              dwSize:=SizeOf(ContentSize);
              // 函数原型 http://msdn.microsoft.com/zh-cn/subscriptions/downloads/aa384238.aspx
              if HttpQueryInfo(hRequest,HTTP_QUERY_CONTENT_LENGTH,@ContentSize,dwSize,dwReserved) then
              begin
                dwFileSize:=StrToInt(ContentSize);
                GetMem(Contents, dwFileSize);
                InternetReadFile(hRequest,Contents,dwFileSize,dwBytesRead);
                Result:=StrPas(Contents);
                FreeMem(Contents);
              end;
            end;
          end;
          InternetCloseHandle(hRequest);
        end;
        InternetCloseHandle(hConnection);
      end;
      InternetCloseHandle(hInte);
    end;
    

    初步判断了一下https情况,还有flags需要再细致一点设置,还有自定义表头,https的用户名密码等用参数形式封装.

    还有一个最主要的问题就是超时问题的解决。这个等以后有时间再弄

  • 相关阅读:
    docker启动:Got permission denied while trying to connect to the Docker daemon
    Centos7上安装docker
    Docker个人理解总结
    IDEA 的Class not found: "..."Empty test suite
    启动总是提示:Process finished with exit code 0
    配置xml:url is not registered
    MD5加密与Hash加密
    java线程安全问题之静态变量、实例变量、局部变量
    Dockerfile 常用指令
    通过 Service 访问 Pod
  • 原文地址:https://www.cnblogs.com/prtmon/p/3297216.html
Copyright © 2011-2022 走看看