使用kbmMW#1轻松实现REST
使用kbmMW很容易创建REST服务器。
首先,我们制作服务器应用程序(或服务......取决于您)。
在这种情况下,我们将添加一个简单的Form,为我们的kbmMW组件提供GUI和位置。
在Delphi中,单击文件 - 新建 - VCL Forms应用程序
拖放以下两个组件到Form上:
- TkbmMWServer
- TkbmMWTCPIPIndyServerTransport

将kbmMWTCPIPIndyServerTransport1的Server属性设置为kbmMWServer1。
双击kbmMWTCPIPIndyServerTransport1的Bindings属性以打开其编辑器。为0.0.0.0端口80添加绑定,这是默认的HTTP服务器端口。您可以选择所需的任何端口其他绑定,但让要REST用户知道。

设置kbmMWTCPIPIndyTransport1属性Streamformat为REST。(译者注:这是必须的一步,表明服务端可以接收REST请求)

现在保存项目,然后双击Form,写OnCreate事件:
procedure TForm7.FormCreate(Sender: TObject);
begin
kbmMWServer1.AutoRegisterServices;//注册Rest服务
kbmMWServer1.Active:=true;//启动Server
end;
在接口Uses部分,手工填加单元: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;//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访问的Web服务器的基础。现在继续添加可以从任何REST客户端调用的功能。
在Delphi中,单击文件 - 新建 - 其他 - Components4Developers向导,然后选择kbmMW服务向导。单击确定。

在继续选择我们将添加的kbmMW服务类型之前,我们需要确定要创建的REST服务器类型。它可以是纯REST服务器,只通过代码返回数据,也可以是常规Web服务器,从磁盘上的文件提供数据,如html模板,图像,CSS文件等。这里只想制作一个纯REST服务器,因此我们选择Smart Service / kbmMW_1.0。

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

单击“下一步”直接进入此页面,然后单击绿色复选标记按钮,生成一个空的服务单元。

从表面上看,它看起来像一个普通的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;
现在编译并运行应用服务器,就可以访问HelloWorld方法,并得到这个方法返回的内容。找开浏览器,在地址栏输入:
HTTP://LocalHost/MyREST/HelloWorld
确保大小写是正确的,因为HTTP标准描述了地址的URL部分必须区分大小写。如果您要编写http://localhost/MyREST/HelloWorld,则会被告知请求无效。
这一切都很好......但我的REST客户端希望收到一个JSON对象,而不仅仅是简单的文本。
好的..我将展示3种方法......手动的方式,半自动化的方式和完全自动化的方式。
手动方式。将HelloWorld函数更改为如下所示:
function TkbmMWCustomSmartService8.HelloWorld:string;
begin
Result:='{''result'':''Hello world''}';
end;
REST客户端将收到一个匿名对象,其中包含名为result的属性,其中包含“Hello world”。
半自动化方式:
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的对象表示法框架,我们可以选择将其作为XML或YAML或BSON或MessagePack流式传输,而不是简单地实例化适当的流式传输器。
自动化方式:
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"}}
这不一定是错的,但不同。
通过在其上设置各种属性,有很多控制选项可以显示对象的流。例如,可以选择以不同的名称返回Result属性等。
kbmMW还了解返回TkbmMemTable实例,数组和许多其他类型的信息,因此很容易通过几乎没有其他代码行来REST化您的kbmMW业务功能。
作为最终说明,由于HelloWorld方法也使用属性[kbmMW_Method]标记,因此它也可由本机kbmMW客户端调用。
使用kbmMW#1轻松实现REST的更多相关文章
- SmartBinding与kbmMW#1
即将发布的kbmMW,实现了SmartBinding,SmartBinding的设计目标是: 必须易于使用 必须最小化或完全删除锅炉板代码.(你看到这里的趋势了吗?... kbmMW从那时开始就是为了 ...
- 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,可以生成由各种 ...
- kbmMW功能#5 - kbmMWProcess单元
在新的kbmMW v.5.06.20版本中新加kbmMWProcess单元.通过TkbmMWProcess类的各种类方法,可以轻松地在Windows上对外部进程进行分组,启动和停止.在即将发布的小修补 ...
- REST easy with kbmMW #17 – Database 6 – Existing databases
kbmMW已经包含了非常精细的功能来确定和解释数据库中表的元数据. 在下一版本中,这个功能将得到进一步加强,可以导入现有数据库中的表,自动创建与表相匹配的ORM实体类. 这意味着你能够使用kbmMW的 ...
- kbmMW授权管理解析(The kbmMW Authorization manager explained)
从kbmMW v.4.40开始,引入了一个新的非常灵活的授权管理器. 它的目的是为开发人员提供为用户定义资源权限的功能,这是一个可选功能,将现有的授权事件驱动方案内置到kbmMW中,使授权开发任务更容 ...
- kbmMW均衡负载与容灾(3)(转载红鱼儿)
在kbmMW均衡负载与容灾(1)中,介绍了利用ClientTransport的OnReconnect事件,对联接的应用服务器的地址进行更换,做容灾处理.实际上,作者还给我们提供了另外一种机制,直接在C ...
- REST easy with kbmMW #3 – SSL
我在前两篇文章中展示了“REST easy with kbmMW”文章,如何使用kbmMW制作REST服务器,以及如何使用该REST服务器轻松地从数据库返回和存储数据,所有这些都在不到30行的真实数据 ...
- REST easy with kbmMW #14 – DB Controlled login
介绍 关于如何使用授权和登录管理来构建应用服务器还存在一些问题,其中之一就是用户及其角色如何在在数据库中定义.该文将解释使用TkbmMWAuthorizationManager解决此问题的一种方法.有 ...
随机推荐
- C#中的DllImport使用方法
DllImport是System.Runtime.InteropServices命名空间下的一个属性类,其功能是提供从非托管DLL导出的函数的必要调用信息 DllImport属性应用于方法,要求最少要 ...
- 基于大规模语料的新词发现算法【转自matix67】
最近需要对商品中的特有的词识别,因此需新词发现算法,matrix的这篇算法很好. 对中文资料进行自然语言处理时,我们会遇到很多其他语言不会有的困难,例如分词——汉语的词与词之间没有空格,那计算机怎么才 ...
- python渗透测试工具集合
作者:一起学习Python 原文链接:https://zhuanlan.zhihu.com/p/21803985 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 在进行漏洞研究. ...
- AtCoder Grand Contest 013 C :Ants on a Circle
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- Cocos2d-x学习笔记(七)菜单
菜单类继承关系如下: 图1 菜单类继承关系 文本菜单只能显示文本,包括:MenuItemLabel.MenuItemFont和MenuItemAtlasFont: #include "Hel ...
- 【转】DrawDibDraw
http://blog.csdn.net/normallife/article/details/53177315 BMP位图文件结构及平滑缩放 用普通方法显示BMP位图,占内存大,速度慢,在图形缩小时 ...
- c++ primer plus 第五章 课后题答案
#include <iostream> using namespace std; int main() { ; cout << "Please enter two n ...
- m_Orchestrate learning system---三十四、使用重定义了$的插件的时候最容易出现的问题是什么
m_Orchestrate learning system---三十四.使用重定义了$的插件的时候最容易出现的问题是什么 一.总结 一句话总结:如下面这段代码,定义了$的值,还是会习惯性的把$当成jQ ...
- Spring Boot 文档
本节对 Spring Boot 的参考文档做了一个简单概述.本章节对全文的参考手册进行内容上的一些索引. 你可以参考本节,从头到尾依次阅读该文档,也可以跳过不感兴趣的内容. Spring Boot 参 ...
- Population Size CodeForces - 416D (贪心,模拟)
大意: 给定$n$元素序列$a$, 求将$a$划分为连续的等差数列, 且划分数尽量小. $a$中的$-1$表示可以替换为任意正整数, 等差数列中必须也都是正整数. 贪心策略就是从前到后尽量添进一个等差 ...