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

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


posted @ 2017-06-23 23:18  小宇飞刀  阅读(576)  评论(0编辑  收藏  举报