zoukankan      html  css  js  c++  java
  • 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


  • 相关阅读:
    catboost原理以及Python代码
    lightgbm原理以及Python代码
    stacking算法原理及代码
    python自动化之爬虫模拟登录
    python自动化之爬虫原理及简单案例
    python自动化之PDF
    input type="file"鼠标无法变小手
    typescript中类和接口的区别
    TypeScript基础类型
    微信小程序-获取input值的两种方法
  • 原文地址:https://www.cnblogs.com/xieyunc/p/9126484.html
Copyright © 2011-2022 走看看