使用新版kbmMW开发的 smart service,也可以轻松的发布为通过REST来调用的功能。
一个 kbmMW smart service象下面这样实现,就可以使用REST来访问:
type
// This service is known to smart clients as SMARTDEMO
// Methods registered for REST access will, if they
// provide a relative path, be sub pathed under /myserver
[kbmMW_Service('SMARTDEMO')]
[kbmMW_Rest('path:/myserver')]
TkbmMWCustomService2 = class(TkbmMWCustomSmartService)
public
// This method can be called both from REST and
// from smart clients.
// Its called from REST clients like this:
// http://../helloworld
[kbmMW_Method('HelloWorld')]
[kbmMW_Rest('method:get, path: "/helloworld"')]
function HelloWorld:string;
// This method can be called both from REST and
// from smart clients.
// Its called from REST clients like this:
// http://../myserver/myechostring/somestring
// or
// http://../myserver/echostring/somestring
// somestring (can be anything) will be echoed back.
// The argument AString will automatically receive
// the value provided as somestring.
[kbmMW_Method('EchoString')]
[kbmMW_Rest(
'method:get, '+
'path: [ "echostring/{AString}","myechostring/{AString}" ]')]
function EchoString(
[kbmMW_Rest('value: "{AString}"')]
const AString:string):string;
// This method is only available from REST calls, not
// from smart clients. (kbmMW_Method attribute is missing)
// It can be called from a browser like this:
// http://.../someabspath/addnumbers?arg1=10&arg2=20
// The functions arguments are automatically populated
// with the arguments.
[kbmMW_Rest('method:get, path: "/someabspath/addnumbers"')]
function AddNumbers(
[kbmMW_Rest('value: "$arg1", required: true')]
const AValue1:integer;
[kbmMW_Rest('value: "$arg2", required: true')]
const AValue2:integer;
[kbmMW_Arg(mwatRemoteLocation)]
const ARemoteLocation:string):integer;
// This method gets and owns a TPerson instamce, which it must
// itself free. The method is not available for REST calls.
[kbmMW_Method]
function StorePerson(
[kbmMW_Arg(mwatOwnedValue)]const APerson:TPerson):integer;
// This method is only available from smart clients.
// It receives a TPerson instamce which is owned by the
// caller. When called from a smart client, the kbmMW framework
// is the owner and will automatically free it.
[kbmMW_Method]
function StorePerson2(const APerson:TPerson):integer;
// This method is only available from smart clients.
// It receives a IPerson2 interface.
[kbmMW_Method]
function StorePerson3(const APerson:IPerson2):integer;
// This method can be called both from REST and
// from smart clients.
// The method returns a TPerson instamce which is
// automatically freed by the kbmMW framework after marshalling.
// (Its default to free a returned object)
[kbmMW_Rest('method:get, path: "getperson/{id}", freeResult:true')]
[kbmMW_Method(true)]
function GetPerson([kbmMW_Rest('value:{id}')]id:string):TPerson;
end;
// Functions published by the service.
//------------------------------------
function TkbmMWCustomService2.HelloWorld:string;
begin
Result:='Hello world';
end;
function TkbmMWCustomService2.EchoString(const AString:string):string;
begin
Result:=AString;
end;
function TkbmMWCustomService2.ReverseString(
const AString:string;
const AClientIdentity:TkbmMWClientIdentity):string;
begin
Result:=StrUtils.ReverseString(AString);
end;
function TkbmMWCustomService2.AddNumbers(
const AValue1,AValue2:integer;
const ARemoteLocation:string):integer;
begin
Result:=AValue1+AValue2;
// In ARemoveLocation the reported remote location
// for the client is found.
end;
function TkbmMWCustomService2.StorePerson(
const APerson:TPerson):integer;
begin
// The TPerson instance is owned by this function,
// and must be manually freed.
APerson.Free;
Result:=0;
end;
function TkbmMWCustomService2.StorePerson2(
const APerson:TPerson):integer;
begin
// The TPerson instance is automatically freed
// upon exit of this function.
Result:=0;
end;
function TkbmMWCustomService2.StorePerson3(
const APerson:IPerson2):integer;
begin
// The lifetime of IPerson2 depends on reference counting.
Result:=0;
end;
function TkbmMWCustomService2.GetPerson([id:string):TPerson;
begin
Result:=TPerson.Create;
Result.Name:='Sofie Mogensen';
Result.Age:=87;
end;
initialization
TkbmMWRTTI.EnableRTTI(TkbmMWCustomService2);
从浏览器中发启REST调用:
A) http://localhost/myserver/getperson/1
Results in this response:
{"person":{"Name":"Sofie Mogensen","Address":"","Age":87}}
B) http://localhost/someabspath/addnumbers?arg1=10&arg2=20
Results in this response
30
Its dead easy to create the server. Just have a central form/datamodule
with the kbmMWServer instance, a transport with the new REST
streamformat setup, and configured to listen on port 80, and add all the
smart service units you want (like the above).
Do:
kbmMWServer1.AutoRegisterServices;
kbmMWServer1.Active:=true;
and you are running your REST and smart client server!
As usual all this can be combined with traditional services and clients.
While REST calls results in objects automatically being streamed and
unstreamed as JSON, smart clients will automatically stream and unstream
object and interface instances in messagepack format, which is now also
supported.
来源:官方新闻组
http://blog.sina.com.cn/s/blog_44fa172f0102whuv.html
- JIRA 知多少:聊一聊 Android Studio 、工作流相关设置
Android Studio 相关 配置 JIRA 服务器 如果细心的话会发现有一个选项卡:Commit Message.这一段代码是不是有点熟悉呢?你没有猜错,这段代码就是 commit 模板,当你 ...
- REST easy with kbmMW #15 – Handling HTTP POST
我被问到有关如何通过基于kbmMW智能服务(Smart Service)的REST处理POST的问题. 这篇博客文章解释了典型的POST各种形式的访问,以及如何在kbmMW中处理它们. POST变种W ...
- 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,可以生成由各种 ...
- Delphi revelations #1 – kbmMW Smart client on NextGen (Android) – Scope problems
Delphi 启示 #1 – kbmMW Smart client on NextGen (Android) – 作用域问题 以更高级的方式使用kbmMW smart client,在Android设 ...
- 使用delphi-cross-socket 开发kbmmw smart http service
前几天我说了使用delphi-cross-socket 扩展kbmmw 的跨平台支持,今天我说一下使用 kbmMWCrossScoketHttpServerTransport 在linux 下支持 k ...
- 使用kbmmw smart service 属性时的一个注意事项
kbmmw 5.0 以后支持smart service, 这个用起来非常方便,kbmmw 通过 定制属性来简化编程,可以参考我以前的文章.但是这个意味着使用单元引用一定要小心, 否则出了问题,都不知道 ...
- 一窥kbmmw中的 smart service
在kbmmw 的新版中(还没有发布),将会有一个叫做smart service 的服务.这种服务的属性基于服务器端,并且可以自动注册服务名,下面就是一个简单例子代码.这个服务里面有有三个发布的函数:e ...
- REST easy with kbmMW #3 – SSL
我在前两篇文章中展示了“REST easy with kbmMW”文章,如何使用kbmMW制作REST服务器,以及如何使用该REST服务器轻松地从数据库返回和存储数据,所有这些都在不到30行的真实数据 ...
随机推荐
- 刷题总结——宠物收养所(bzoj1208)
题目: Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物.每个领养者都希望领养到自己满意的宠物,阿Q根据领养者的要求通过他自己发明 ...
- Linux(9):期中架构(1)--- 集群构架 & 备份服务
01. 了解集群架构服务器组成 基本架构组成:(用于让用户进行访问) # 前端服务部分: 1)顾客-用户 是一个访问者,请求访问网站页面 2)保安-防火墙设备 对访问架构用户进行策略控制,正常访问网站 ...
- poj 1061 青蛙的约会(二元一次不定方程)
Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要 ...
- 中国余数定理 2(codevs 3990)
题目描述 Description Skytree神犇最近在研究中国博大精深的数学. 这时,Sci蒟蒻前来拜访,于是Skytree给Sci蒟蒻出了一道数学题: 给定n个质数,以及k模这些质数的余数.问: ...
- java多线程编程核心技术学习-1
实现多线程的两种方式 继承Thread类,重写Thread类中的run方法 public class MyThread extends Thread{ @Override public void ru ...
- 洛谷 P3865 【模板】ST表
P3865 [模板]ST表 题目背景 这是一道ST表经典题——静态区间最大值 请注意最大数据时限只有0.8s,数据强度不低,请务必保证你的每次查询复杂度为 O(1)O(1) 题目描述 给定一个长度为 ...
- 转:HtmlCxx用户手册
1.1 简介 使用由KasperPeeters编写的强大的tree.h库文件,可以实现类似STL的DOM树遍历和导航. 打包好的Css解析器. 看似很像C++代码的C++代码(其实已不再是C++了) ...
- 识别SQL Server 性能杀手
性能优化的重点在于识别定位问题,预先了解主要的性能杀手,能够更快的定位到问题并将工作集中在可能的原因之上. SQL SERVER性能杀手主要集中在如下几类: 1.1 低质量的索引 低质量的索引通常 ...
- maven删除不必要的依赖;优化pom依赖研究
mvn dependency:copy-dependencies -DoutputDirectory=/home/admin/git/oceanus/test 会把所有依赖的插件版本都拷贝进去,而不是 ...
- Matlab多项式拟合測试
x=0:0.2:4; %生成等差数列 rnd=rand(1,size(x,2))*5; %生成一组随机数 y=x.*x.*x+x.*x+6+rnd; %生成y=x^3+x^2+6函数在垂直方向5个尺度 ...