我的服务器中有一个 php 脚本,它非常简单,因为他只有一个任务:将两个数据存储在 sql 数据库中。
http://mydomain.it/test.php?id=285&numero=504;
Run Code Online (Sandbox Code Playgroud)
如果你在浏览器中打开这个 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;
Run Code Online (Sandbox Code Playgroud)
上面的代码运行得非常好,因为运行只需要 1 秒,而且我正在捕获异常(仅用于调试目的)。我有两个主要问题:
这是我第一次使用 indy,据我所知,这是做我需要的好方法。我不确定我是否将 放在try-except正确的位置;是吗?
如果互联网连接很慢怎么办?我应该使用类似下面的代码吗?
代码
var process: array of ITask;
begin
SetLength(process, 1);
process[0] := TTask.Create(
procedure
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;
end
);
process[0].Start;
TTask.WaitForAll(process);
Label1.Text := 'done!!';
end;
Run Code Online (Sandbox Code Playgroud)
第 2 节中的代码有一些问题,它不起作用。任何的想法?
首先,当您在浏览器中输入 URL 时,它会发送GET请求,而不是POST请求。您应该使用TIdHTTP.Get()而不是TIdHTTP.Post():
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;
Run Code Online (Sandbox Code Playgroud)
现在,回答您的问题:
一般来说,try/except你展示的没问题。我更喜欢把上面显示的放在try/finally里面try/except,而不是相反。但是根据您实际使用代码的位置, atry/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;
Run Code Online (Sandbox Code Playgroud)