Delphi 用WinInet 单元实现 POST提交数据

11 篇文章 0 订阅
7 篇文章 0 订阅

由于贪方便,用idhttp控件实现POST部分。结果发现频繁提交的时候总产生10054 等N多不可控错误。遂想换其它方法。百度找了下。基本都是靠webbrowser 、idhttp等控件提交的。于是,摸索着用 wininet.dll的api自己实现了一个webpost。效果不错。特地贴上方便自己以后检索。

代码:

function WebPagePost(sURL,sPostData:string):Pointer;stdcall;
const
  RequestMethod = 'POST';
  HTTP_VERSION  = 'HTTP/1.1';  //HTTP版本 我抓包看过 HTTP/1.0 HTTP/1.1。尚未仔细了解其区别。按MSDN来写的。留空默认是1.0
var
  dwSize:DWORD;
  dwFileSize: Int64;
  dwBytesRead,dwReserved:DWORD;
  hInte,hConnection,hRequest:HInternet;
  ContentSize:array[1..1024] of Char;
  HostPort:Integer;
  HostName,FileName,sHeader:String;
  procedure ParseURL(URL: string;var HostName,FileName:string;var HostPort:Integer);
  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);
    HostName := URL;
    FileName := '/';
    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;
      HostPort:=StrToIntDef(Copy(HostName,p+1,k),INTERNET_DEFAULT_HTTP_PORT);
      Delete(HostName,p,k+1);
    end;
  end;
begin
  Result := Pointer(-1);
  dwFileSize :=0;
  ParseURL(sURL,HostName,FileName,HostPort);
  // 函数原型见 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
      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(StrPas(@ContentSize));
            GetMem(Result, dwFileSize);
            InternetReadFile(hRequest,Result,dwFileSize,dwBytesRead);
          end;
        end;
      end;
      InternetCloseHandle(hRequest);
    end;
    InternetCloseHandle(hConnection);
  end;
  InternetCloseHandle(hInte);
end;


调用方法:

WebPagePost('http://www.xxx.com/register.php','user=xxx;pass=xxx');

  • 19
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Delphi是一种编程语言,可以使用它来开发Windows平台的应用程序。如果你想在Delphi中发送POST请求并使用JSON数据,可以按照以下步骤操作: 1. 首先,你需要在Delphi中使用一个HTTP组件来发送HTTP请求。常见的组件包括Indy、Synapse和WinINet。 2. 在你的Delphi项目中导入所选HTTP组件的单元文件。 3. 创建一个HTTP客户端对象,并设置请求的URL和方法为POST。 4. 设置请求的Content-Type为application/json,以指示服务器你将发送JSON数据。 5. 创建一个JSON对象,并将要发送的数据填充到该对象中。 6. 将JSON对象转换为字符串,并将其作为请求的正文内容。 7. 发送请求并等待服务器的响应。 8. 处理服务器的响应,可以根据需要解析返回的JSON数据。 下面是一个示例代码,使用Indy组件来发送POST请求并使用JSON数据: ```delphi uses IdHTTP, System.JSON; procedure SendJSONPostRequest; var HttpClient: TIdHTTP; RequestContent: TStringStream; ResponseContent: string; JsonRequest: TJSONObject; begin HttpClient := TIdHTTP.Create(nil); try JsonRequest := TJSONObject.Create; try // 构建JSON数据 JsonRequest.AddPair('name', 'John'); JsonRequest.AddPair('age', '30'); // 转换JSON为字符串 RequestContent := TStringStream.Create(JsonRequest.ToString, TEncoding.UTF8); try // 发送POST请求 HttpClient.Request.ContentType := 'application/json'; ResponseContent := HttpClient.Post('http://example.com/api', RequestContent); // 处理服务器响应 // ... finally RequestContent.Free; end; finally JsonRequest.Free; end; finally HttpClient.Free; end; end; ``` 以上代码中的URL为示例,请将其替换为实际的API地址。同时,请根据你实际使用的HTTP组件来修改代码。 希望能对你有所帮助!如果你还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值