XMLHTTPRequest、IDHTTP、SQLConnection访问DataSnap/Restful接口服务演示程序

来源:互联网 发布:unity3d 过山车 编辑:程序博客网 时间:2024/05/29 20:01

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


原创粉丝点击