DATASNAP REST WEBSERVICES中间件如何跨平台使用

准备使用DELPHI开发移动设备开发的朋友对DATASNAP REST中间件不可不了解。

DATASNAP REST新型WEBSERVICES中间件使用的通信协议和数据封装格式:

使用HTTP通信协议,HTTP协议哪个平台都支持;使用JSON作为数据的封装格式,几乎所有的开发语言都可以解析JSON数据。

REST的目的就是通过简单的URL来完成对中间层远程方法的调用并返回JSON格式的数据,调用方解析JSON数据然后将数据秀出来。

正是基于以上原因,DATASNAP REST中间件才可以为苹果和安卓的移动的NATIVE APP提供数据服务;也可以为WINDOWS、LINUX、MAC等

桌面型NATIVE APP提供数据服务。

下面笔者将对跨平台作出演示:

1.根据DELPHI的向导生成DATASNAP REST中间件(略过)。

2.在中间件远程方法里面增加一个方法:

function TServerMethods1.GetData(sql: string): tdataset;
begin
  q.close;
  q.sql.clear;
  q.sql.text := sql;
  q.Open;
  Result:= q;
end;

3.客户端调用,因为演示跨平台的原因,此处只介绍通过URL调用中间件的方法。

procedure TForm1.Button1Click(Sender: TObject);
var
  s:string;
  jo: ISuperObject;
  ja, jb, jc: TSuperArray;
  i, h: Integer;
  FieldList: TStringList;
  arr: array of array of string;
begin
  Memo1.Clear;
  FieldList:= TStringList.Create;
  try
  s := idhttp1.Get(‘http://localhost:8080/datasnap/rest/TServerMethods1/GetData/select * from t1 where iid=‘‘2‘‘‘);
  Memo1.Lines.add(s);
  jo := so(s);
  ja := jo[‘result‘].AsArray;
  // 获取字段列表
  jb := ja[0][‘table‘].AsArray;
  for i := 0 to jb.Length-1 do begin
    jc := jb[i].AsArray;
    FieldList.Add(jc[0].AsString)
  end;
  // 数据集创建字段
  cds.close;
  cds.FieldDefs.Clear;
  for i := 0 to fieldList.Count -1 do begin
    CDS.FieldDefs.Add(fieldList[i],ftString,100, False);
  end;
  CDS.CreateDataSet;
  // 设置表格的列宽
  for i := 0 to dbgrid1.Columns.Count-1 do begin
    DBGrid1.Columns[i].width := 80;
  end;
  // 数据集填充数据
  SetLength(arr, ja[0][FieldList[0]].AsArray.Length, FieldList.Count);
  for i := 0 to fieldlist.count-1 do begin   // col
    jb := ja[0][FieldList[i]].AsArray;
    for h := 0 to jb.Length-1 do begin    // row
      arr[h, i] := jb[h].AsString;
    end;
  end;
  cds.DisableControls; try
  for i := 0 to jb.Length-1 do begin // row
    cds.Append;
    for h := 0 to fieldlist.count-1 do begin   // col
      cds.Fields[h].Value := arr[i, h];
    end;
    cds.Post;
  end;
  finally
    cds.EnableControls;
  end;

finally
  FieldList.Free;
  end;
end;

几乎所有的开发语言都支持通过HTTP GET,然后解析中间件返回的JSON数据。具体代码由各开发语言的程序员编写,此处

只介绍DELPHI如何URL调用的代码。

4.返回的JSON数据样例

{"result":[{"table":[["iid",26,0,0,50,102,102,0,false,false,0,false,false],["name",26,1,0,50,102,102,0,false,false,0,false,false]],"iid":["1","2"],"name":["\u6D4B\u8BD5\u4E00","\u6D4B\u8BD5\u4E8C"]}]}

各开发语言解析JSON数据然后呈现。

后记:

delphi xe5新增加了RESTCLIENT组件,用它替代indy的http控件调用REST WEBSERVICE,再也不用人工去解析返回的JSON格式去生成CLIENTDATASET数据了,设置几个属性即可,几乎是零编码。

unit Unit1;

interface

uses   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,   System.Classes, Vcl.Graphics,   Vcl.Controls, Vcl.Forms, Vcl.Dialogs, IPPeerClient, Data.DB,   Datasnap.DBClient, REST.Response.Adapter, REST.Client, Data.Bind.Components,   Data.Bind.ObjectScope, Vcl.StdCtrls, Vcl.Grids, Vcl.DBGrids, IdBaseComponent,   IdComponent, IdTCPConnection, IdTCPClient, IdHTTP, superobject;

type   TForm1 = class(TForm)     DBGrid1: TDBGrid;     Button1: TButton;     DataSource1: TDataSource;     ClientDataSet1: TClientDataSet;     IdHTTP1: TIdHTTP;     procedure Button1Click(Sender: TObject);   private     { Private declarations }   public     { Public declarations }   end;

var   Form1: TForm1;

implementation

{$R *.dfm}

procedure rest_exec(cds: TClientDataSet; url: string); var   jo: ISuperObject;   ja, jb, jc: TSuperArray;   i, h: Integer;   FieldList: TStringList;   arr: array of array of string;   http: TIdHTTP; begin   FieldList := TStringList.Create;   http := TIdHTTP.Create(nil);   try     jo := so(http.Get(url));     ja := jo[‘result‘].AsArray;     // 获取字段列表     jb := ja[0][‘table‘].AsArray;     for i := 0 to jb.Length - 1 do     begin       jc := jb[i].AsArray;       FieldList.add(jc[0].AsString)     end;     // 数据集创建字段     cds.close;     cds.FieldDefs.Clear;     for i := 0 to FieldList.Count - 1 do     begin       cds.FieldDefs.add(FieldList[i], Data.DB.ftString, 100, False);     end;     cds.CreateDataSet;     // 数据集填充数据     SetLength(arr, ja[0][FieldList[0]].AsArray.Length, FieldList.Count);     for i := 0 to FieldList.Count - 1 do     begin // col       jb := ja[0][FieldList[i]].AsArray;       for h := 0 to jb.Length - 1 do       begin // row         arr[h, i] := jb[h].AsString;       end;     end;     cds.DisableControls;     try       for i := 0 to jb.Length - 1 do       begin // row         cds.Append;         for h := 0 to FieldList.Count - 1 do         begin // col           cds.Fields[h].Value := arr[i, h];         end;         cds.Post;       end;     finally       cds.EnableControls;     end;

finally     FieldList.Free;     http.Free;   end; end;

procedure TForm1.Button1Click(Sender: TObject); var   url: string; begin   url :=     ‘http://localhost:18888/cxg/middle/TSysMethods/rest_GetData/select * from pos_master/0‘;   rest_exec(ClientDataSet1, url); end;

end.

http://www.cnblogs.com/hnxxcxg/p/3280230.html

时间: 2024-11-02 12:00:04

DATASNAP REST WEBSERVICES中间件如何跨平台使用的相关文章

datasnap的前世今生

随着XE6,XE7,以及半年以后即将发布的XE8,DATASNAP将顺应跨平台的需要, 有可能的情况是这样的:XE8,DATASNAP写的中间件将可以运行在LINUX服务器上面. 大家都知道COM是WINDOWS特有的东西,为了跨平台,COM将被弃用. DATASNAP残留的COM基因的东西统统将被弃用,COM的数据序列格式OLEVARIANT将被弃用, CLIENTDATASET的DATA和DELTA属性是OLEVARIANT,因此也将被弃用,CLIENTDATASET的替代品是FDMEMTA

2016-02-12 网站开发知识梳理--v1.0

1. 梳理的体系结构如下:   2.下面具体讲讲我目前的认知状况: <1> 浏览器端优化: 目的 -- 降低页面加载时间 #影响加载时间的因素: 页面上的资源(图片.js.css等)资源链接数 静态文件是否设置了缓存(依据expires/ETAG) 页面上链接是否来自多个域名(浏览器同时向同一个域名发起的链接数是固定的,所以将不同的文件放到不同的二级域名下可以提高资源链接的并发数) cookie的使用(非通用的cookie不要设置成根域名,否则所有页面.js.图片在访问时都会带上cookie,

ZeroC Ice权威指南

这篇是计算机类的优质预售推荐<ZeroC Ice权威指南>. >|下一代互联网中间件 | 跨平台 | 跨语言 | 分布式 | 安全 | 透明 | 面向对象 | 性能优越 | 防火期穿透 | 通信屏蔽 | 电商系统基础架构Paas平台基础设施 | Rest杀手 | RPC之王 | 互联网架构师必备工程利器 编辑推荐 1.ZeroC Ice具有如下看点: |下一代互联网中间件 | 跨平台 | 跨语言 | 分布式 | 安全 | 透明 | 面向对象 | 性能优越 | 防火期穿透 | 通信屏蔽|电

单节点数据库的压力测试

mysqlslap是mysql自带的基准测试工具,优点:查询数据,语法简单,灵活容易使用.该工具可以模拟多个客户端同时并发的向服务器发出查询更新,给出了性能测试数据而且提供了多种引擎的性能比较.mysqlslap为mysql性能优化前后提供了直观的验证依据. 可以模拟出大量客户端同时操作数据库的情况,通过结果信息来了解数据库的性能状况. mysqlslap 的一个主要工作场景就是对数据库服务器做基准测试. 例如我们拿到了一台服务器,准备做为数据库服务器,那么这台服务器的硬件资源能够支持多大的访问

DELPHI10.2开发的跨平台中间件

什么是跨平台? DELPHI跨平台已经不是停留在理论,而是可以实用了. 同一套中间件既能在WINDOWS服务器上面部署,又以在LINUX服务器上面部署. 而做到这一切,只需要一套源代码,这完全得益于DELPHI 10.2全新的跨平台编译器. 想想,你的同一个中间件同时可以在WINDOWS和LINUX服务器上部署运行,这是一件多么激动人心的事情啊! 笔者不免心情澎湃! CENTOS 7 服务器上运行中间件: 中间件详情日志: WINDOWS客户端访问CENTOS7上的中间件并返回查询数据: 同一份

论DATASNAP中间件对象池

在此,笔者以DATASNAP为例,其它中间件以此类推. 中间件为什么要使用对象池? 对象池——让所有的对象免堕轮回之苦,对象不再为其生和死而烦恼. 要想让中间件长久稳定地运行,做到无人值守,对象池很重要,对象池大致分为以下几类. 1)线程池,DATASNAP使用INDY10作为其通讯控件,其线程池实际上就是使用INDY10的,只是DATASNAP在其基础上再封装了一层壳罢了,留给我们的只需要设置相关控件的属性即可,在些不多说: 2)服务对象池,DATASNAP向导会生成一个ServerMetho

跨平台通信中间件thrift学习【Java版本】(转)

转自:http://neoremind.com/2012/03/%E8%B7%A8%E5%B9%B3%E5%8F%B0%E9%80%9A%E4%BF%A1%E4%B8%AD%E9%97%B4%E4%BB%B6thrift%E5%AD%A6%E4%B9%A0%E3%80%90java%E7%89%88%E6%9C%AC%E3%80%91/ 1. What is thrift? Thrift是一个跨语言的服务部署框架,最初由Facebook于2007年开发,2008年进入Apache开源项目.跨平台

DATASNAP中间件支持安卓手机客户端

DATASNAP的中间件不仅支持WINDOWS客户端调用,也支持安卓手机,苹果手机客户端调用,当然也包括各种平板客户端调用. 咏南DATASNAP中间件支持安卓手机客户端.测试环境:DELPHI XE8编译,手机系统是安卓5.1,界面使用FIREMONKEY. DELPHI编写手机客户端的注意事项: 1)客户端必须 uses IPPeerClient,否则连接中间件的时候会报错: 2)不再需要USES MIDASLIB:在工程里面引用反而会报错: 3)中间件的远程方法参数不支持WIDESTRIN

DotNetCore跨平台~聊聊中间件

回到目录 在进行.net core平台之后,我们如果希望在请求过程中添加一些事件是非常容易的,你可以把这些事件做成一个中间件Middleware,然后这些中间件就会以Http pipeline的管道方式进行相应,并且它们就像是一个职责链,从你定义的第一个中间件开始,一个一个向下传递,直到最后一个中间件完成为止! 前几天我写了在.net core里实现模块化服务,DotNetCore跨平台~组件化时代来了主要是将我们定义的组件添加到IServiceCollection集合里,然后在程序启动后去注册