虽然本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