delphi 12 idhttpsever(S)+idhttp(C) 实现简单的JSON API服务
这篇博客展示了如何使用Delphi创建一个简单的HTTP服务器,并处理GET和POST请求。服务器监听6600端口,响应JSON格式的数据。客户端通过IdHttp组件进行GET和POST请求,获取并显示服务器响应的内容。
http服务器测试代码
procedure TForm1.FormShow(Sender: TObject);
begin
IdHTTPServer1.Bindings.Clear;
IdHTTPServer1.DefaultPort:= 6600;
IdHTTPServer1.Bindings.Add.IP := '127.0.0.1';
//启动服务器
IdHTTPServer1.Active := True;
end;
procedure TForm1.IdHTTPServer1CommandGet(AContext: TIdContext;
ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var
I: Integer;
begin
if SameText(ARequestInfo.Command, 'get') then
begin
if ARequestInfo.Document = '/api_v1/get_token' then
begin
Memo1.Lines.Add('-------------');
Memo1.Lines.Add(ARequestInfo.Params.Count.ToString);
Memo1.Lines.Add('-------------');
for I := 0 to ARequestInfo.Params.Count - 1 do
begin
Memo1.Lines.Add(ARequestInfo.Params.ValueFromIndex[I]);
end;
Memo1.Lines.Add('-------------');
AResponseInfo.CharSet := 'UTF-8';
AResponseInfo.ContentType := 'application/json';
AResponseInfo.ContentText := '{a:"001", b:"002", c:[ a:"003", b:"004"]}';
end;
end;
if SameText(ARequestInfo.Command, 'post') then
begin
if ARequestInfo.Document = '/api_v2/get_token' then
begin
Memo1.Lines.Add('-------------');
Memo1.Lines.Add(ARequestInfo.Params.Count.ToString);
Memo1.Lines.Add('-------------');
for I := 0 to ARequestInfo.Params.Count - 1 do
begin
Memo1.Lines.Add(ARequestInfo.Params.ValueFromIndex[I]);
end;
Memo1.Lines.Add('-------------');
AResponseInfo.CharSet := 'UTF-8';
AResponseInfo.ContentType := 'application/json';
AResponseInfo.ContentText := '{a:"0011", b:"0022", c:[ a:"0033", b:"0044"]}';
end;
end;
end;
客户端DEMO
客户端DEMO
procedure TForm2.Button1Click(Sender: TObject);
var
ttt: String;
begin
ttt := IdHttp1.Get('http://127.0.0.1:6600/api_v1/get_token?a=1&b=2');
memo1.Text := ttt;
end;
procedure TForm2.Button2Click(Sender: TObject);
var
Sendmessage:TStringList;//发送内容
Receivemessage:TStringStream;//返回内容
ttt: String;
begin
Sendmessage:=TStringList.Create;
Receivemessage:=TStringStream.Create('');
Sendmessage.Add('ID=1001');//必须要有Add('字段=值')这种模式,否则传递过去服务端接收的是空值
Sendmessage.Add('name=jack');//还可以用Param.Add(head+middle+Edit1.text)的方式连接成有效的数组
Sendmessage.Add('sex=male');
IdHTTP1.ReadTimeout:=10000;//设置十秒后超时
IdHttp1.Post('http://127.0.0.1:6600/api_v2/get_token',Sendmessage, Receivemessage);
memo1.Text:=Receivemessage.DataString;//显示返回的值
Sendmessage.Free;
Receivemessage.Free;
end;