虽然本Demo是用Delphi写的,但是因为XMLHTTPRequest是一种通用技术,故同样适合其他常见的程序语言和脚本语言,如Java、js、php、C#、ASP.NET、ASP、Perl等等。
先看DEMO运行效果:
一、通过XMLHTTPRequest方式调用接口服务:
后台数据库对应的数据:
本操作的单击事件代码为:
procedure TTestForm.ExecServerMethodByXMLHttp(const useGet: Boolean);
var
url,UsrPwd_Base64: string;
myXMLHTTP:IXMLHTTPRequest;
JsonParamStr:string;
begin
Memo1.Clear;
Memo1.Lines.Add('XMLHTTPRequest '+RadioGroup1.Items[RadioGroup1.ItemIndex]+'方式:');
Memo1.Lines.Add('执行状态:');
Memo2.Clear;
Memo2.Lines.Add('XMLHTTPRequest '+RadioGroup1.Items[RadioGroup1.ItemIndex]+'方式:');
Memo2.Lines.Add('返回结果:');
myXMLHTTP := CoXMLHTTP.Create;//早期版本如Delhp7中则为 myXMLHTTP := CoXMLHTTPRequest.Create;
//两种提交请求的方式:Get和Post,Get是通过URL地址传递参数如果是中文需要转码,需要添加时间戳 Post不需要添加时间戳
//get url := 'http://localhost:5269/api/webmemberapi/NewMemberRegister?timestamp='+inttostr(Windows.GetTickCount);
//DELPHI生成的Restful服务无法添加时间戳,但可以禁用缓存功能,像这样:myXMLHTTP.setRequestHeader('If-Modified-Since', '0'); //禁用缓存功能
url := GetSrvUrl;//把edt_Url.Text和edt_Key.Text中的参数进行了分析和拼接处理
if useGet then
begin
//http get
if chk_Pwd.Checked then
//myXMLHTTP.open('Get',url,True,edt_User.Text,edt_Pwd.Text) //请不要在此放入验证用户和密码,会出错!
myXMLHTTP.open('Get',url,False,EmptyParam,EmptyParam)
else
myXMLHTTP.open('Get',url,False,EmptyParam,EmptyParam);
end else
begin
//http post 如用post方法实际上是调用updateGetRoomInfo_ByRoom,post方式会在函数名前加上update前缀
myXMLHTTP.open('Post', url, False, EmptyParam, EmptyParam);
end;
if chk_Pwd.Checked then //如果服务器需要验证用户,请把验证信息放入Header中。
begin
begin
UsrPwd_Base64 := edt_User.Text+':'+edt_Pwd.Text;
UsrPwd_Base64 := 'Basic '+EncodeString(UsrPwd_Base64);//'Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ=='
myXMLHTTP.setRequestHeader('Authorization', UsrPwd_Base64);
end;
end;
//myXMLHTTP.setRequestHeader('Accept', 'application/x-www-form-urlencoded');
//myXMLHTTP.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
myXMLHTTP.setRequestHeader('If-Modified-Since', '0'); //禁用缓存功能,相当于添加了时间戳
myXMLHTTP.setRequestHeader('Accept', 'application/json');
myXMLHTTP.setRequestHeader('Content-Type', 'application/json');
myXMLHTTP.setRequestHeader('Charset', 'utf-8');
//请求主体
try
if useGet then
begin
//http get 如果url中已包含了参数,则无需在此再次传递参数
myXMLHTTP.send(EmptyStr);
end else
begin
//http post
JsonParamStr := GetParamStr_Json;//GetParamStr;//
myXMLHTTP.send(JsonParamStr);
end;
Memo1.Lines.Add(Format('XMLHTTPRequest.status:%d',[myXMLHTTP.status]));
Memo1.Lines.Add(Format('XMLHTTPRequest.statusText:%s',[myXMLHTTP.statusText]));
Memo2.Lines.Add(myXMLHTTP.responseText);
except
on Ex:Exception do
Memo1.Lines.Add(Ex.Message);
end;
end;
二、通用SOCKET方式调用接口服务执行结果:
仍然是查询前面提到的后台数据库中的记录。
因SQLConnection既支持SOCKET工作方式,同时又支持HTTP工作方式,下面的代码为对这两种工作方式分别进行了处理:
procedure TTestForm.ExecServerMethodBySocket(const useTcp_Ip: Boolean);
var
SQLConnection1:TSQLConnection;
vobj:TServerMethodsClient;
begin
SQLConnection1 := TSQLConnection.Create(nil);
Memo1.Clear;
if useTcp_Ip then
Memo1.Lines.Add('Socket TCP/IP 方式:') //SOCKET工作方式
else
Memo1.Lines.Add('Socket HTTP 方式:');
Memo1.Lines.Add('执行状态:');
Memo2.Clear;
if useTcp_Ip then
Memo2.Lines.Add('Socket TCP/IP 方式:')
else
Memo2.Lines.Add('Socket HTTP 方式:');
Memo2.Lines.Add('返回结果:');
try
SQLConnection1.Close;
SQLConnection1.LoginPrompt := False;
SQLConnection1.DriverName := 'DataSnap';
SQLConnection1.Params.Values['HostName'] := GetSrvHost;
SQLConnection1.Params.Values['DatasnapContext'] := 'peci';
if chk_Pwd.Checked then //如果服务器网站需要安全验证,填入验证所需的信息。
begin
SQLConnection1.Params.Values['DSAuthenticationUser'] := edt_User.Text;
SQLConnection1.Params.Values['DSAuthenticationPassWord'] := edt_Pwd.Text;
SQLConnection1.Params.Values['UserName'] := edt_User.Text;
SQLConnection1.Params.Values['PassWord'] := edt_Pwd.Text;
end else
begin
SQLConnection1.Params.Values['DSAuthenticationUser'] := '';
SQLConnection1.Params.Values['DSAuthenticationPassWord'] := '';
SQLConnection1.Params.Values['UserName'] := '';
SQLConnection1.Params.Values['PassWord'] := '';
end;
if useTcp_Ip then //使用SOCKET工作方式
begin
//如果使用tcp/ip协议,则使用下面的语句
SQLConnection1.Params.Values['CommunicationProtocol'] := 'tcp/ip';
SQLConnection1.Params.Values['Port'] := edt_Tcp_Port.Text;
end else
begin
//如果使用http协议,则使用下面的语句
SQLConnection1.Params.Values['CommunicationProtocol'] := 'http';
SQLConnection1.Params.Values['Port'] := GetSrvPort;//GetSrvPort函数会从URL中解析出所需的端口号信息
end;
try
if not SQLConnection1.Connected then
SQLConnection1.Connected := True;
vobj := TServerMethodsClient.Create(SQLConnection1.DBXConnection);
Memo2.Lines.Add(vobj.ExecSrvMethod(GetSrvMethodName,GetParamStr));
Memo1.Lines.Add('OK');
except
on e:Exception do
Memo1.Lines.Add(e.Message);
end;
finally
FreeAndNil(vobj);
FreeAndNil(SQLConnection1);
end;
end;
本Demo程序下载: http://download.csdn.net/detail/xieyunc/9879261