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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Access to XMLHttpRequest at 'http://39.98.175.93:9099/index/menu' from origin 'http://example.com' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. 这个错误是由于浏览器的同源策略(Same-Origin Policy)所引起的。同源策略是浏览器的一种安全机制,限制了通过JavaScript发起的跨域请求。 在这个错误中,浏览器检测到你的代码正在尝试从一个源(origin)访问另一个源的资源。在默认情况下,浏览器阻止了这种跨域请求,除非服务器在响应中包含了适当的CORS头部。 为了解决这个问题,你需要在目标服务器上配置CORS头部,使其允许来自'http://example.com'的跨域请求。具体的配置方式和步骤取决于你使用的服务器和框架。 一种常见的解决方法是在服务器端设置响应头部,添加'Access-Control-Allow-Origin'字段,并将其值设为允许跨域请求的源的地址(例如'http://example.com')。这样浏览器就会允许来自该源的请求访问服务器资源了。 另外,你也可以使用代理服务器来绕过同源策略的限制。通过将跨域请求发送到代理服务器,再由代理服务器转发请求给目标服务器,这样就可以在不修改目标服务器配置的情况下实现跨域请求。 总结起来,要解决这个问题,你可以通过配置目标服务器的CORS头部,或者使用代理服务器来实现跨域请求。具体的实施方法和步骤会根据你的服务器和框架而有所不同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值