REST easy with kbmMW #1
kbmMW 5.0支持REST服务器的开发,并且非常简单,下面看看如何实作一个REST服务器。
首先我们制作一个服务器应用程序,增加一个简单的Form,并放置kbmMW组件。
在Delphi中单击File - New - VCL Forms Application
然后将以下kbmMW组件添加到Form中:
- TkbmMWServer
- TkbmMWTCPIPIndyServerTransport

将kbmMWTCPIPIndyServerTransport1的Server属性设置为kbmMWServer1。
设置组件kbmMWTCPIPIndyTransport1的Streamformat属性为REST,如下图:

保存项目,Delphi将自动填加引用的单元,双击Form,建立OnCreate事件:
procedure TForm7.FormCreate(Sender: TObject);
begin
kbmMWServer1.AutoRegisterServices;
kbmMWServer1.Active:=true;
end;
定位到单元的interface段,手工填加引用的单元kbmMWRESTTransStream.
再次保存,得到如下的单元:
unit Unit7; interface uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, kbmMWCustomTransport, kbmMWServer,
kbmMWTCPIPIndyServerTransport, kbmMWRESTTransStream; type
TForm7 = class(TForm)
kbmMWServer1: TkbmMWServer;
kbmMWTCPIPIndyServerTransport1: TkbmMWTCPIPIndyServerTransport;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end; var
Form7: TForm7; implementation {$R *.dfm} procedure TForm7.FormCreate(Sender: TObject);
begin
kbmMWServer1.AutoRegisterServices;
kbmMWServer1.Active:=true;
end; end.
现在,一个实现REST服务器的基础功能具备了,接下来,我们来填加一些可以从任意REST客户端调用的具体功能.
在Delphi中,单击File-New-Other-Components4Developers wizard:

在继续选择我们要添加的kbmMW Service的类型之前,需要确定要创建什么类型的REST服务器。它可以是一个纯粹的REST服务器,只提供自己的代码中的数据,也可以是常规的Web服务器,可以从磁盘上的文件(如html模板,图像,CSS文件等)提供数据。
这里,我们只想做一个纯粹的REST服务器,所以选择了Smart service / kbmMW_1.0。
如果你希望能够从磁盘提供文件,甚至可以将代理请求提供给其他FastCGI兼容服务器(如PHP等),那么您将选择HTTP智能服务。

点击下一步,输入REST服务的默认名称,在这个例子中,我称之为MyREST。

接下来一路Next,直到下面显示的页面,然后点击绿色的勾号按钮

现在已经生成了没有功能的Service。表面看,这个Service就像一个TDataModule,可以放在TDataModule上的任意组件这里都可以用,但是现在我们对它的代码更感兴趣,所以按F12切换到代码视图,浏览顶部的注释,直到找到实际的代码。
type
[kbmMW_Service('name:MyREST, flags:[listed]')]
[kbmMW_Rest('path:/MyREST')]
// Access to the service can be limited using the [kbmMW_Auth..] attribute.
// [kbmMW_Auth('role:[SomeRole,SomeOtherRole], grant:true')]
TkbmMWCustomSmartService8 = class(TkbmMWCustomSmartService)
private
{ Private declarations }
protected
{ Protected declarations }
public
{ Public declarations }
// HelloWorld function callable from both a regular client,
// due to the optional [kbmMW_Method] attribute,
// and from a REST client due to the optional [kbmMW_Rest] attribute.
// The access path to the function from a REST client (like a browser)+
// is in this case relative to the services path.
// In this example: http://.../MyREST/helloworld
// Access to the function can be limited using the [kbmMW_Auth..] attribute.
// [kbmMW_Auth('role:[SomeRole,SomeOtherRole], grant:true')]
[kbmMW_Rest('method:get, path:helloworld')]
[kbmMW_Method]
function HelloWorld:string;
end;
implementation
uses kbmMWExceptions;
{$R *.dfm}
// Service definitions.
//---------------------
function TkbmMWCustomSmartService8.HelloWorld:string;
begin
Result:='Hello world';
end;
如果您现在编译和运行应用程序,就得到了只有一个REST功能的Web服务器,这个功能叫HelloWorld,不带参数,并返回一个字符串。
打开你最喜欢的浏览器,并通过在地址栏中输入这个功能的地址来测试该功能:
http://localhost/MyREST/helloworld
确保地址的大小写是正确的,因为HTTP标准描述地址的URL部分必须区分大小写。如果你写的是http://localhost/MyREST/HelloWorld,你会被告知请求无效。
这看起来已经很好了,但我的REST客户端期望接收一个JSON对象,而不仅仅是简单的文本。
现在我准备展示三种方法来做到这一点:
- 手动方式
- 半自动化方式
- 全自动化的方式
1.手动方式,将HelloWorld函数更改为如下所示:
function TkbmMWCustomSmartService8.HelloWorld:string;
begin
Result:='{''result'':''Hello world''}';
end;
REST客户端将收到一个名为result的属性的匿名对象,其中包含“Hello world”。
2.半自动化方式:
uses kbmMWExceptions
,kbmMWObjectNotation
,kbmMWJSON; {$R *.dfm} // Service definitions.
//--------------------- function TkbmMWCustomSmartService8.HelloWorld:string;
var
o:TkbmMWONObject;
jsonstreamer:TkbmMWJSONStreamer;
begin
o:=TkbmMWONObject.Create;
jsonstreamer:=TkbmMWJSONStreamer.Create; o.AsString['result']:='Hello world';
Result:=jsonstreamer.SaveToUTF16String(o); jsonstreamer.Free;
o.Free;
end;
这样可以很容易地创建复杂的JSON文档,更爽的是,由于我们使用kbmMW的object notation framework,因此可以选择XML或YAML或BSON或MessagePack等格式进行传输。
3.全自动化方式:
type TMyResult = class
private
FResult:string;
public
property Result:string read FResult write FResult;
end; [kbmMW_Service('name:MyREST, flags:[listed]')]
[kbmMW_Rest('path:/MyREST')]
// Access to the service can be limited using the [kbmMW_Auth..] attribute.
// [kbmMW_Auth('role:[SomeRole,SomeOtherRole], grant:true')] TkbmMWCustomSmartService8 = class(TkbmMWCustomSmartService)
private
[kbmMW_Rest('method:get, path:helloworld, anonymousResult:true')]
[kbmMW_Method]
function HelloWorld:TMyResult;
end; implementation uses kbmMWExceptions; {$R *.dfm} // Service definitions.
//--------------------- function TkbmMWCustomSmartService8.HelloWorld:TMyResult;
begin
Result:=TMyResult.Create;
Result.Result:='Hello world';
end; initialization
TkbmMWRTTI.EnableRTTI(TkbmMWCustomSmartService8);
kbmMWRegisterKnownClasses([TMyResult]);
end.
全自动化方式简单的实现返回具有所需信息的对象,kbmMW自动将对象转换为JSON(因为我们正在使用REST streamformat)。
为了确保kbmMW知道对象类型,我们通过kbmMWRegisterKnownClasses进行注册。如果我们没有,kbmMW会抱怨它不知道该对象。
不要担心TMyResult实例会泄漏,当不再使用它时,kbmMW将自动释放它。如果你不希望通过kbmMW释放返回的对象,可以通过在HelloWorld方法的kbmMW_Rest属性中包含freeResult:false来进行说明。
还要注意,kbmMW_Rest属性设置现在包括:anonymousResult:true。这告诉kbmMW我们希望生成的JSON是匿名的,结果如下:
{“TMyResult”:{“Result”:“Hello world”}}
是否匿名输出json,没有对错,取决你的需要,但是一定要记得,输出结果是不同的。
有很多控制选项可以通过设置对象的各种属性来流式传输对象。例如可以选择要以不同的名称返回Result属性。
kbmMW还能返回TkbmMemTable实例,数组和许多其他类型的信息,因此几乎不用其他代码行就可以轻松地实现您的kbmMW业务功能。
作为最后的评论,由于HelloWorld方法也被标记为属性[kbmMW_Method],它也可以由kbmMW客户端调用。
你可以随意转发、评论、点赞、推荐这篇文章
REST easy with kbmMW #1的更多相关文章
- REST easy with kbmMW #3 – SSL
我在前两篇文章中展示了“REST easy with kbmMW”文章,如何使用kbmMW制作REST服务器,以及如何使用该REST服务器轻松地从数据库返回和存储数据,所有这些都在不到30行的真实数据 ...
- REST easy with kbmMW #14 – DB Controlled login
介绍 关于如何使用授权和登录管理来构建应用服务器还存在一些问题,其中之一就是用户及其角色如何在在数据库中定义.该文将解释使用TkbmMWAuthorizationManager解决此问题的一种方法.有 ...
- REST easy with kbmMW #15 – Handling HTTP POST
我被问到有关如何通过基于kbmMW智能服务(Smart Service)的REST处理POST的问题. 这篇博客文章解释了典型的POST各种形式的访问,以及如何在kbmMW中处理它们. POST变种W ...
- REST easy with kbmMW #24 使用kbmMW实现JSON/XML/YAML转换成对象
你想过没有,把一个给定的xml或json生成一个Delphi类,并通过这个类完成对xml或json的读写操作吗? 不管有没有,现在kbmMW为我们实现了,看下面这行代码: var s:string; ...
- REST easy with kbmMW #21 – Delphi client stubs
在之前的博文中,我提到新的存根生成器框架具有生成Delphi客户端存根所需的功能,使得开发Delphi智能客户端非常容易,完全支持编译时的类型检查和IDE类/属性帮助. 我没想到会把它包含在即将发布的 ...
- REST easy with kbmMW #20 – OpenAPI and Swagger UI
即将推出的kbmMW更新不仅是一些bug修正,同时将包含一个新的主要功能:客户端存根生成器框架. 那什么是客户端存根生成器框架呢? 他是一个基于kbmMW smart services,可以生成由各种 ...
- REST easy with kbmMW #17 – Database 6 – Existing databases
kbmMW已经包含了非常精细的功能来确定和解释数据库中表的元数据. 在下一版本中,这个功能将得到进一步加强,可以导入现有数据库中的表,自动创建与表相匹配的ORM实体类. 这意味着你能够使用kbmMW的 ...
- REST easy with kbmMW #16 – Multiple servers using HTTP.sys transport
前文写过使用HTTP.sys转输层(TkbmMWHTTPSysServerTransport),实现一个kbmMW应用服务器. 如果在一台服务器上,同时运行多个,基于TkbmMWHTTPSysServ ...
- REST easy with kbmMW #4 – Access management
在前面有关如何使用kbmMW创建REST服务器的基础上,现在已经到了考虑该如何控制用户的访问.什么是访问管理?就是“允许谁做什么"的问题. 显然,这个世界中存在数据,应该保护他而不被未授权的 ...
随机推荐
- 几句java代码搞定十万个为什么数据
最近想做一个app,为小朋友推荐十万个为什么的故事,但是找了很久数据,发现挺难的找的,又去写爬虫,发现没有一个好的网站可以爬,最后一个偶然的机会在csdn上发现一个可用的接口,很快就把问题解决了,下面 ...
- hive基础指令
- Go项目实战:打造高并发日志采集系统(一)
项目结构 本系列文章意在记录如何搭建一个高可用的日志采集系统,实际项目中会有多个日志文件分布在服务器各个文件夹,这些日志记录了不同的功能.随着业务的增多,日志文件也再增多,企业中常常需要实现一个独立的 ...
- 10 Best Practices for Better RESTful API
转自 http://www.cnblogs.com/mondol/p/6109024.html
- C# 加解密工具类
using System; using System.IO; using System.Security.Cryptography; using System.Text; namespace Clov ...
- 模板引擎总结(Thymeleaf,FreeMarker,Enjoy,Velocity,JSP等)
在java领域,表现层技术主要有以下几种, (1)jsp; (2)freemarker; (3)velocity; (4)thymeleaf; (5)Enjoy; 1.JSP 优点: 1.功能强大,可 ...
- 【POJ - 1703】Find them, Catch them(种类并查集)
Find them, Catch them 直接翻译了 Descriptions 警方决定捣毁两大犯罪团伙:龙帮和蛇帮,显然一个帮派至少有一人.该城有N个罪犯,编号从1至N(N<=100000. ...
- Origin
1.简单的使用 http://wenku.baidu.com/link?url=K1ThI9a-Ws_Rk28K28kBEc9uNRN7k4vHV4pxfieMCaLeA4rGotRAnk8fxCUm ...
- [bzoj3887][Usaco2015 Jan]Grass Cownoisseur_trajan_拓扑排序_拓扑序dp
[Usaco2015 Jan]Grass Cownoisseur 题目大意:给一个有向图,然后选一条路径起点终点都为1的路径出来,有一次机会可以沿某条边逆方向走,问最多有多少个点可以被经过?(一个点在 ...
- Redis(1.5)Redis配置文件(4.0.14)
4.0.14 常用配置 bind 127.0.0.1 # 默认绑定本地,不写的话任何地址都可以访问 protected-mode yes #保护模式,如果没有设置bind 配置地址,也没有设置任何密码 ...