Delphi 独立调用 php 脚本
Delphi indy call php script
我的服务器中有一个非常简单的 php 脚本,因为他只有一个任务:在 sql 数据库中存储两个数据。
http://mydomain.it/test.php?id=285&numero=504;
如果您在浏览器中打开此 url,您将在 sql table 中添加一行,如下所示
我也希望能够使用 firemonkey 将数据存储在数据库中,并且我在我的应用程序中放置了两个 TEdits 和一个 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 秒,而且我正在捕获异常(只是为了调试目的)。我有两个主要问题:
这是我第一次使用 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;
第 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;
现在,回答您的问题:
一般来说,你显示的try/except
是可以的。如上所示,我更喜欢将 try/finally
放在 try/except
中,而不是相反。但是根据您实际使用代码的位置,try/except
可能是多余的,可以省略。
至于 Internet 连接问题 - 一般来说,是的,您应该在 task/thread 中执行 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;
我的服务器中有一个非常简单的 php 脚本,因为他只有一个任务:在 sql 数据库中存储两个数据。
http://mydomain.it/test.php?id=285&numero=504;
如果您在浏览器中打开此 url,您将在 sql table 中添加一行,如下所示
我也希望能够使用 firemonkey 将数据存储在数据库中,并且我在我的应用程序中放置了两个 TEdits 和一个 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 秒,而且我正在捕获异常(只是为了调试目的)。我有两个主要问题:
这是我第一次使用 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;
第 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;
现在,回答您的问题:
一般来说,你显示的try/except
是可以的。如上所示,我更喜欢将 try/finally
放在 try/except
中,而不是相反。但是根据您实际使用代码的位置,try/except
可能是多余的,可以省略。
至于 Internet 连接问题 - 一般来说,是的,您应该在 task/thread 中执行 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;