DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: hxh57738897
今日帖子: 24
在线用户: 14
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 sxqwhxq (步惊云) ★☆☆☆☆ -
普通会员
2021/12/4 9:13:11
标题:
讨论一下,前端JS工具怎样调用DataSnap Rest? 浏览:3025
加入我的收藏
楼主: 1、datasnap rest能干什么?
datasnap rest是一个三层、多层中间件组件。用它能够写很多函数,写函数基本上跟在VCL上写函数一样,包括增删查改数据库,对服务器的文件操作,等等。客户端连接datasnap REst后,能够将这些函数迁移至客户端,这样客户端可能调用这样函数,就像调用客户本地函数一样。所有,用datasnap rest写一个大文件(G级别)上传下载函数,基本上5行搞定。同时,datasnap rest有很优秀的并发性能,用ab/jemter模拟高并发,以exe方式可以达到3000个线程,以dll方式发布,可达到10000个线程。
2、datasnap rest有何局限?
datasnap rest是跨平台的。因此用datasnap rest写的服务器中间件可以运行在win/linux,而且客户端可以是android/win/ios/linux/web。所以可以在delphi的FMX模式开,写大型的跨平台app/exe。
但datasnap rest不是跨语言的。你要想获得datasnap rest所有功能,客户端必须要连接它,必须通过 TDSRestConnection建立连接,这是个非常复杂的组件。所以,datasnap rest的跨平台,只能在delphi里跨。
3、怎样发挥datasnap rest在web和跨平台开发的优势?
datasnap rest是强大的服务器后端组件。而现在delphi web主要依靠unigui、 intraweb,功能和可靠性有差距。
vue/React/Angularjs组件丰富,可以做出无所不能的前端web/andorid/ios效果。怎样在这些框架中访问datasnap rest呢?delphi帮助文件似乎有点提示,但根本没有可行的方案。
我是业余编程者,对js框架不熟悉,请精通js web开发的delphi 大V开启这扇光明之窗,在这个帖子里发表您的建议,谢谢!
----------------------------------------------
-
作者:
男 sxqwhxq (步惊云) ★☆☆☆☆ -
普通会员
2021/12/4 9:56:10
1楼: delphi帮助文件里,有怎样在java/C#/java/objective C连接datasnap rest的教程,唯独没有怎样在js中连接的教程。
也许同仁们会问,你把数据封装为json对象不就,在服务器和客户端解析不就可以了吗?确实可以这样做,但用json/xml通信,只适合小数据交换,而大数据交换,必须要stream,这个处理是很难跨语言的。
----------------------------------------------
-
作者:
男 emailx45 (emailx45) ▲▲▲▲△ -
普通会员
2021/12/4 11:44:13
2楼: As far as I know and I've seen countless MVP Embarcadero videos, to exchange information with environments outside the DataSnap universe, yourself already gave the answer: send "JSON", receive "JSON" or XML, or any other thing!

There is no need for any other client application to know what goes on behind the data server, even if it is a Datasnap application/DLL.

The only attention you should have is this:
What kind of data does the server deliver and what kind of data does the client expect to get from the server?

In the same way that many web-services (API) propagate their services properly documented, as in the case of public APIs (ex.: Facebook, Google, etc...), such services talk to, practically, which other services all through protocols duly negotiated between the parties. That is, if you need to receive or send some type of data to a server made in Delphi/CBuilder using DataSnap technology (based on DBX classes), you just need to determine how this data will travel between the parts.

DataSnap can seamlessly send and receive data using standard JSON, XML or its own style of sending and receiving data. There is not necessarily a tie to this technology.

If you need to send an "object" that only exists in your programming language, for example, you can encapsulate it in standard JSON, for example, which is much lighter than XML, and in the client application, you will unpack the received data, and, recreate the object you expected.

So, as in communication between "MODEM" -- one modulates, and the other demodulates.
----------------------------------------------
The higher the degree, the greater the respect given to the humblest!RAD 11.3
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2021/12/4 18:44:45
3楼: REST 的意思,其实就是在 WEB 上传递 J-S-O-N 数据。

有了 J-S-O-N 数据,你客户端当然可以用 JavaScript 来处理。就这么简单。

所以客户端就两件事:
1. 如何使用 JavaScript 来调用服务器端的方法获取 JSON 数据;
2. 拿到 JSON 数据以后如何解释。
----------------------------------------------
-
作者:
男 wk_knife (wk_knife) ★☆☆☆☆ -
盒子活跃会员
2021/12/4 22:26:09
4楼: https://docwiki.embarcadero.com/HTML5_Builder/en/DataSnap
----------------------------------------------
-
作者:
男 wk_knife (wk_knife) ★☆☆☆☆ -
盒子活跃会员
2021/12/4 22:53:35
5楼: https://www.embarcadero.com/fr/rad-in-action/datasnap-rest

Representational State Transfer (REST) is a new architecture for Web Services that is having a significant impact on the industry. Most of the new public web services from large vendors (Google, Yahoo, Amazon, now also Microsoft) rely on REST as the technology for sharing and merging information from multiple sources. Delphi XE supports REST through the DataSnap infrastructure, support for WebBroker integration, and the creation of JavaScript proxies for methods exposed by web service.

看黑体的部分。
----------------------------------------------
-
作者:
男 sxqwhxq (步惊云) ★☆☆☆☆ -
普通会员
2021/12/5 0:26:38
6楼: emailx5的中文翻译:
据我所知,我看过无数的MVP Embarcadero视频,为了与DataSnap宇宙之外的环境交换信息,你自己已经给出了答案:发送“JSON”,接收“JSON”或XML,或任何其他东西!

任何其他客户机应用程序都不需要知道数据服务器后面发生了什么,即使它是Datasnap应用程序/DLL。

您唯一应该注意的是:

服务器提供什么样的数据,客户端希望从服务器获得什么样的数据?

与许多web服务(API)以正确记录的方式传播其服务(如公共API(如Facebook、Google等))一样,此类服务实际上通过双方之间正式协商的协议与其他哪些服务进行对话。也就是说,如果需要使用DataSnap技术(基于DBX类)接收或发送某种类型的数据到Delphi/CBuilder中的服务器,则只需确定这些数据将如何在部件之间传输。

DataSnap可以使用标准JSON、XML或其自己的发送和接收数据风格无缝地发送和接收数据。这项技术不一定有联系。

例如,如果您需要发送一个仅存在于您的编程语言中的“对象”,那么您可以将其封装在标准JSON中,例如,它比XML轻得多。在客户端应用程序中,您将解压缩接收到的数据,然后重新创建您期望的对象。

因此,在“调制解调器”之间的通信中,一个进行调制,另一个进行解调。
----------------------------------------------
-
作者:
男 roadrunner (roadrunner) ★☆☆☆☆ -
盒子活跃会员
2021/12/5 10:28:26
7楼: Datasnap的服务有两种调用方式,REST和Tunnel,

REST方式就是简单地将参数拼在URL上,如果拼不上那就是你接口设计的问题,所以对于JS来说就是一个拼URL的操作,不需要任何其他额外的帮助

Tunnel方式是模拟编译语言的服务类方法定义,在创建DataSnap项目时勾选上那个Mobile Connector的选项之后,在项目编译目录下就会多出一个目录里头会存放有JS服务类定义的JS文件,前端就引用那个JS然后调用其中的服务类即可,这个方法适合于传递一些不适合用URL参数表达的复杂类参数。

对于前端技术人员来说,当然是REST模式简单易用,而走REST模式,则要求后端在接口设计上充分考虑构造URL的容易程度,面向前端构造接口,不要只盯着自己设计的复杂业务类。
----------------------------------------------
-
作者:
男 sxqwhxq (步惊云) ★☆☆☆☆ -
普通会员
2021/12/5 17:31:58
8楼: delphi 10以上的版本,FMX技术相对比较成熟了,可直接在FMX中设计ios\android\linux,因为FMX的基因就是多平台。
datasnap rest服务器与客户端的数据传递的主要载体是TFDJsonDataSets和TStream,传格式化的信息,用FDJsonDataset和数据更新包TFDJSONDeltas,主要是对数据库字段信息的增删查改。处理大数据,如视频、图片和文件这类二进制信息,主要用流。无论是FDjsondataset还是steam,都是在ObjectPasCal语言层面实现的,所以在FMX中,结合Firedac和LiveBinding技术,即可写出跨平台应用,基本与在delphi中写win32应用无异。
但delphi仍然没有考虑如何在datasnap和FMX中,用JS 开发web。delphi并没有在语言层面考虑WEB开发。因此你很难发挥delphi在WEB开发中数据处理和面向对象的组件化优势,unigui和intraweb只能算是一个delphi的组件。
datasnap rest 只是跨平台,跨语言跨域可能比较难,特别是在JS中。在vue中,就算能够调用服务器函数返回数据,也很难在js中处理这些数据,虽然能处理json,但处理各种流,里面不知道要踩多少个坑。还有,其实datasnap rest还有一个非常强大的功能,借助回调函数,服务器函数可以调用客户端函数,这样,服务器可以掌握客户端的本地信息。这样具体delphi特质的技术,在其它语言里是很难实现的。
也许在vue/React/Angularjs这类现代JS框架中使用datasnap只是愿景,实际很难做。个人见解,不喜勿喷。
----------------------------------------------
-
作者:
男 roadrunner (roadrunner) ★☆☆☆☆ -
盒子活跃会员
2021/12/6 8:37:36
9楼: 楼上的,如果你面向的前端是JS或者其他语言,那就不应该在datasnap服务端返回DATASET或者Stream, 这两个东西应当仅在面对DELPHI客户端的时候使用

面对非DELPHI客户端,你的服务端应当返回简单的类或类数组
----------------------------------------------
-
作者:
男 roadrunner (roadrunner) ★☆☆☆☆ -
盒子活跃会员
2021/12/6 8:38:36
10楼: 所以不要太死板,面对不同的工具组合,应当采用不同的服务端接口设计
----------------------------------------------
-
作者:
男 wiseinfo (wisienfo) ★☆☆☆☆ -
普通会员
2021/12/6 9:42:09
11楼: 为何不直接用WebBroker 输出JSON,
----------------------------------------------
-
作者:
男 wk_knife (wk_knife) ★☆☆☆☆ -
盒子活跃会员
2021/12/8 11:37:24
12楼: 为啥我记得用datasnap在设计期可以生成好多种语言的接口,包括js,参见我在5楼的回复
----------------------------------------------
-
作者:
男 sxqwhxq (步惊云) ★☆☆☆☆ -
普通会员
2021/12/9 16:42:55
13楼: Datasnap rest 并发性能优异,稳定性好,使用简单。
但datasnap rest缺少的是可用的web组件。
而拥有Web组件的有UniGui、TMS Web Core&Intraweb。
可不可以结合起来用呢?
本人正在探索中。
问题是,在UniGui、TMS Web Core、Intraweb中,连接数据库很方便,但datasnap rest并不会为它们提供数据库连接,只能为客户端提供TDSRestConnection连接。这个连接可以把datasnap rest上写的函数发布在客户端模块上。
也就是datasnnap rest和Unigui都放在服务器上,unigui成了datasnap rest的客户。
然后可以在unigui中调用datasnap rest的所有函数。我们可以在这些函数中写增删查改数据库的操作,然后通过Tjsondataset提交给datasnap rest。
所说unigui的大规模并发性能逊于datasnap rest。而瓶颈主要在unigui对高并发数据库访问处理上尚没有更新进的办法。
如果我们结合datasnap rest和unigui各自的优势,让unigui去处理网页和前端,让datasnap rest去处理服务器数据库访问的后端。也许会产生可怕的生产力。
猜想罢了,还未实践。
----------------------------------------------
-
作者:
男 roadrunner (roadrunner) ★☆☆☆☆ -
盒子活跃会员
2021/12/10 0:05:40
14楼: UniGUI和Intraweb之类的,就直接用FIREDAC打开连接池就好,再连一次datasnap完全就是拖累性能降低可靠性,没必要
----------------------------------------------
-
作者:
男 sxqwhxq (步惊云) ★☆☆☆☆ -
普通会员
2021/12/10 0:44:42
15楼: 经过一下午,我现在已经可以使用datasnap rest组合unigui了。
现在,我用datasnap rest中间件获取数据库数据,然后用fdjsondataset发送到unigui,再在unigui里用fdmemtable获取从服务器发过来的数据,这个时候就可以用uni的数据组件显示数据了。测试后,比直接在uni里通过fdconnection连接数据库,再用fdquery查询数据要快。估计并发多,性能会更好。
----------------------------------------------
-
作者:
男 roadrunner (roadrunner) ★☆☆☆☆ -
盒子活跃会员
2021/12/10 20:56:40
16楼: datasnap服务比直接用fdconection快,那就说明你代码写错了,最底层都是一样的FDCONNECTION,套了一重JSON封装再套一重HTTP服务,能比直接使用还快你这是开玩笑呢

回头查错去吧
----------------------------------------------
-
作者:
男 szyourname (szyourname) ★☆☆☆☆ -
盒子活跃会员
2021/12/10 21:36:46
17楼: DataSnap有这么优秀强大了?
----------------------------------------------
-
作者:
男 sxqwhxq (步惊云) ★☆☆☆☆ -
普通会员
2022/1/13 11:31:12
18楼: 使用datasnap rest的一个重要原因,是datasnap rest有很先进的回调机制。也就是服务器端可以回调客户端函数。
但unigui的客户端是虚拟的,从虚拟的客户端向服务器请求数据是可行的,而从服务器通过回调主动推送数据到unigui的虚拟客户端,是不可能的。
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2022/1/13 12:16:47
19楼: 楼上18楼,我觉得你没把基本技术原理搞清楚。

Delphi 的 DataSnap 有好几种玩法。其中一种是客户端和服务器端的直接 TCP 长连接,而不是 HTTP。这种直接 TCP 长连接,服务器端作为一个 TCP SERVER 才可以回调客户端。这种情况,客户端是 DELPHI 自己写的程序。

至于 REST,是另外一种东西,是给 WEB 浏览器作为客户端使用的。浏览器里面的 JS 通过 HTTP 访问服务器获取 JSON 数据后,JS 再处理这个数据,用网页展示出来。这种情况,DELPHI 只提供服务器端,是 WEB SERVER 的类型。这种情况,怎么回调?

当然,现在 WEB 也有 TCP 长连接。但这个和 REST 也没什么关系。

随便网上搜了一下 REST 的概念,这篇文章讲得不错:
https://www.jianshu.com/p/350122cf63f2

这里讲的,REST 就是通过 HTTP 的各种请求去和服务器端交互,可没有说服务器端会主动回调客户端的。
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行46.875毫秒 RSS