Delphi indy调用php脚本

Delphi indy调用php脚本,delphi,indy,Delphi,Indy,我的服务器中有一个非常简单的php脚本,因为他只有一个任务:在sql数据库中存储两个数据 http://mydomain.it/test.php?id=285&numero=504; 如果在浏览器中打开此url,将在sql表中添加一行,如下所示 我也希望能够使用firemonkey将数据存储在数据库中,我在我的应用程序中放置了两个TEDIT和一个TButton。单击此代码执行的按钮: var url: string; H: TIdHttp; SS: TStringStream;

我的服务器中有一个非常简单的php脚本,因为他只有一个任务:在sql数据库中存储两个数据

http://mydomain.it/test.php?id=285&numero=504;
如果在浏览器中打开此url,将在sql表中添加一行,如下所示

我也希望能够使用firemonkey将数据存储在数据库中,我在我的应用程序中放置了两个TEDIT和一个TButton。单击此代码执行的按钮:

var url: string;
 H: TIdHttp;
 SS: TStringStream;
begin
 url := 'http://mydomain.it/test.php?id='+IntToStr(a)+'&numero='+IntToStr(b);
 H := TIdHttp.Create(nil);
 try
  SS := TStringStream.Create;
  try

   try
    H.Post(url, SS);
   except
    on E:Exception do
    ShowMessage(e.Message);
   end;

  finally
   SS.Free;
  end;
 finally 
  H.Free;
 end;
上面的代码运行得非常好,因为运行只需1秒,而且我正在捕获异常(只是为了调试目的)。我有两个主要问题:

  • 这是我第一次使用印地,据我所知,这是一个很好的方式来做我需要的。我不确定是否已将
    try except
    放置在正确的位置;是吗

  • 如果互联网连接很慢怎么办?我应该使用下面的代码吗

  • 代码


    第2节中的代码有一些问题,无法正常工作。有什么想法吗?

    首先,当您在浏览器中输入URL时,它会发送一个
    GET
    请求,而不是
    POST
    请求。您应该使用
    TIdHTTP.Get()
    而不是
    TIdHTTP.Post()

    现在,回答您的问题:

    一般来说,您显示的
    try/except
    很好。我更喜欢将
    try/finally
    放在上面显示的
    try/except
    中,而不是相反。但是,根据实际使用代码的位置,try/except可能是多余的,可以省略

    至于Internet连接问题-通常,是的,您应该在任务/线程中执行HTTP操作,而不是在主UI线程中:

    begin
      TTask.Create(
        procedure
        var
          url, msg: string;
          H: TIdHTTP;
        begin
          try
            url := 'http://mydomain.it/test.php?id='+IntToStr(a)+'&numero='+IntToStr(b);
            H := TIdHTTP.Create(nil);
            try
              H.Get(url);
              // or:
              // H.Get(url, TStream(nil));
            finally
              H.Free;
            end;
            msg := 'done!!';
          except
            msg := 'error!!';
          end;
          TThread.Queue(nil,
            procedure
            begin
              Label1.Text := msg;
            end;
          );
        end
      ).Start;
    end;
    

    据我所知,根本不需要捕捉异常。只需删除try/except。第一段代码有什么问题?你不想在UI线程中运行它吗?好的,我正在删除try/except。如果它在UI线程上运行就可以了,因为执行它只需要一秒钟或更短的时间,但是如果出现x个问题并且连接变慢,UI可能会冻结。我不确定是使用一个任务并让它并行运行,还是只是贴上一个标签,上面写着“进程…”如果你想让UI保持响应,在任务或线程中运行它为什么要使用一个动态的ITask数组?你不能简单地运行一个任务吗?嗯,你确定吗?我认为POST请求是在您传递一些执行操作的参数(在本例中,在sql表中添加一行)时使用的。@RaffaeleRossi-um,是的,我非常确定。是的,
    POST
    可以用于发送参数,但您没有正确使用
    POST
    ,您所说的脚本使用浏览器意味着它使用
    GET
    ,而不是
    POST
    。您可以使用Wireshark或Fiddler之类的数据包嗅探器来验证这一点。
    var
      url: string;
      H: TIdHTTP:
    begin
      url := 'http://mydomain.it/test.php?id='+IntToStr(a)+'&numero='+IntToStr(b);
      try
        H := TIdHTTP.Create(nil);
        try
          H.Get(url);
          // or:
          // H.Get(url, TStream(nil));
        finally 
          H.Free;
        end;
      except
        on E: Exception do
          ShowMessage(e.Message);
      end;
    end;
    
    begin
      TTask.Create(
        procedure
        var
          url, msg: string;
          H: TIdHTTP;
        begin
          try
            url := 'http://mydomain.it/test.php?id='+IntToStr(a)+'&numero='+IntToStr(b);
            H := TIdHTTP.Create(nil);
            try
              H.Get(url);
              // or:
              // H.Get(url, TStream(nil));
            finally
              H.Free;
            end;
            msg := 'done!!';
          except
            msg := 'error!!';
          end;
          TThread.Queue(nil,
            procedure
            begin
              Label1.Text := msg;
            end;
          );
        end
      ).Start;
    end;