我被问到有关如何通过基于kbmMW智能服务(Smart Service)的REST处理POST的问题。

这篇博客文章解释了典型的POST各种形式的访问,以及如何在kbmMW中处理它们。

POST变种
Web/REST客户端可以通过多种方式POST数据:

1.作为URL的路径部分中的值数据
    例如:POST http://localhost/myservice/myfunction/10/20
2.作为URL的查询部分中的键/值数据
    例如:POST http://localhost/myservice/myfunction?arg1=10&arg2=20
3.作为body中的FORM键/值数据。
    例如:POST http://localhost/myservice/myfunction
    然后Body包含:
    name1=value1&name2=value2
4.作为body中的XML或JSON数据。
   例如: POST http://localhost/myservice/myfunction
   然后body包含:
   {“name1″:”value1″,”name2″:”value2”}
5.作为Multipart body 通常作为文件上传的一部分。
您可以根据客户端选择发送数据的方式,然后在服务端以不同方式提取数据。

第一种情况:

[kbmMW_Rest('method:post, path: "myfunction/{value1}/{value2}"')]
function MyFunction(
[kbmMW_Rest('value:"{value1}"')] AValue1:integer;
[kbmMW_Rest('value:"{value2}"')] AValue2:integer):string;

第二种情况:

[kbmMW_Rest('method:post, path: "myfunction"')]
function MyFunction(
[kbmMW_Rest('value:"$value1"')] AValue1:integer;
[kbmMW_Rest('value:"$value2"')] AValue2:integer):string;

第三种情况:

[kbmMW_Rest('method:post, path: "myfunction"')]
function MyFunction(
[kbmMW_Rest('value:body')] ABody:string):string;

然后MyFunctions这样实现:

var
qv:TkbmMWHTTPQueryValues; // Found in kbmMWHTTPUtils.pas
begin
qv:=TkbmMWHTTPQueryValues.Create;
try
qv.AsString:=ABody; // If the body is URL encoded you can use qv.AsEncodedString:=ABody
value1:=qv.ValueByName['value1'];
value2:=qv.ValueByName['value2'];
finally
qv.Free;
end;
end;

第四种情况,有多种方法:

1.如果数据是已知的,可以定义一个class来接收数据。

  [kbmMW_Root('data',[mwrfIncludeOnlyTagged])]
TData = class
private
FValue1:string;
FValue2:string;
public
[kbmMW_Attribute('name1')]
property Value1:string read FValue1 write FValue1; [kbmMW_Attribute('name2')]
property Value2:string read FValue2 write FValue2;
end;
...
[kbmMW_Rest('method:post, path: "myfunction"')]
function MyFunction([kbmMW_Rest('value: "body"')]const AData:TData):integer;

然后将向函数MyFunction提供一个AData实例,并在退出MyFunction时自动释放。

2.如果数据是未知的,则可以用XML或者JSON流

var
on:TkbmMWONCustomObject;
begin
json:=TkbmMWJSONStreamer.Create;
try
on:=json.LoadFromUTF16String(ABody);
if on.IsObject then
begin
value1:=TkbmMWONObject(on).AsString['name1'];
value2:=TkbmMWONObject(on).AsString['name2'];
end;
finally
json.Free;
end;
end;

第五种情况:

它处理起来有点复杂,但kbmMW包含一个TkbmMWHTTPMultiParts类,可用于解密multipart data中每一个边界所包含的数据。这次我们首先要弄清楚它实际上是否是一个multipart body。 然后我们需要弄清楚每个部分之间的边界标识符(boundary identification)是什么,然后我们可以开始将其拆分并分别处理每个部分。

[kbmMW_Rest('method:post, path: "myfunction"')]
function MyFunction:string; function TMyService.MyFunction:string;
var
i:integer;
mp:TkbmMWHTTPMultiParts;
p:TkbmMWHTTPMultiPart;
f:TkbmMWHTTPMimeHeaderValueFields;
helper:TkbmMWHTTPTransportStreamHelper;
sFileName,
sBoundary:string;
fs:TFileStream;
begin
Result:='No data found'; // First pick out content-type header field.
helper:=TkbmMWHTTPTransportStreamHelper(RequestTransportStream.Helper);
f:=helper.Header.ValueFields['Content-Type'];
if f=nil then
exit; // Check if boundary given. If so parse multiparts.
sBoundary:=f.ValueByName['boundary'];
if sBoundary<>'' then
begin
mp:=TkbmMWHTTPMultiParts.Create(RequestStream,sBoundary);
try
// Loop thru parts.
for i:= to mp.Count- do
begin
// Check if file upload.
p:=mp.Parts[i];
f:=p.Headers.ValueFields['Content-Disposition'];
sFileName:=f.ValueByName['filename'];
if sFileName<>'' then
begin
ForceDirectories('.\receivedfiles');
sFileName:='.\receivedfiles\'+sFileName;
DeleteFile(sFileName);
fs:=TFileStream.Create(sFileName,fmCreate+fmOpenWrite);
try
p.SaveToStream(fs);
finally
fs.Free;
end;
Result:='Thank you for the file '+sFileName;
end;
end;
finally
mp.Free;
end;
end;
end;

结束语

kbmMW REST smart service还有许多其他功能。 其中一些在“REST easy”系列的其他博客文章中有解释,您可能还想查看包含600多页文档,请访问我们的网站http://www.components4developers.com,寻找kbmMW文档。

如果你喜欢这篇文章,可以在任何地方分享关于kbmMW的消息,如分享和复制这个博客的内容或者联接到你认为任何可能有用的地方。

哦......还有关于那个特色图片的什么? 这是丹麦的邮箱...在丹麦语中我们称之为“Post kasser”。 因为互联网的作用,这种景观已经越来越少,过去10年里,约85%的邮局已经消失,相反,由当地的杂货店来处理各种慢如蜗牛的邮件。

原文地址:https://components4developers.blog/2018/07/07/rest-easy-with-kbmmw-15-handling-http-post/

REST easy with kbmMW #15 – Handling HTTP POST的更多相关文章

  1. REST easy with kbmMW #3 – SSL

    我在前两篇文章中展示了“REST easy with kbmMW”文章,如何使用kbmMW制作REST服务器,以及如何使用该REST服务器轻松地从数据库返回和存储数据,所有这些都在不到30行的真实数据 ...

  2. REST easy with kbmMW #14 – DB Controlled login

    介绍 关于如何使用授权和登录管理来构建应用服务器还存在一些问题,其中之一就是用户及其角色如何在在数据库中定义.该文将解释使用TkbmMWAuthorizationManager解决此问题的一种方法.有 ...

  3. REST easy with kbmMW #24 使用kbmMW实现JSON/XML/YAML转换成对象

    你想过没有,把一个给定的xml或json生成一个Delphi类,并通过这个类完成对xml或json的读写操作吗? 不管有没有,现在kbmMW为我们实现了,看下面这行代码: var s:string; ...

  4. REST easy with kbmMW #20 – OpenAPI and Swagger UI

    即将推出的kbmMW更新不仅是一些bug修正,同时将包含一个新的主要功能:客户端存根生成器框架. 那什么是客户端存根生成器框架呢? 他是一个基于kbmMW smart services,可以生成由各种 ...

  5. REST easy with kbmMW #17 – Database 6 – Existing databases

    kbmMW已经包含了非常精细的功能来确定和解释数据库中表的元数据. 在下一版本中,这个功能将得到进一步加强,可以导入现有数据库中的表,自动创建与表相匹配的ORM实体类. 这意味着你能够使用kbmMW的 ...

  6. REST easy with kbmMW #21 – Delphi client stubs

    在之前的博文中,我提到新的存根生成器框架具有生成Delphi客户端存根所需的功能,使得开发Delphi智能客户端非常容易,完全支持编译时的类型检查和IDE类/属性帮助. 我没想到会把它包含在即将发布的 ...

  7. REST easy with kbmMW #16 – Multiple servers using HTTP.sys transport

    前文写过使用HTTP.sys转输层(TkbmMWHTTPSysServerTransport),实现一个kbmMW应用服务器. 如果在一台服务器上,同时运行多个,基于TkbmMWHTTPSysServ ...

  8. REST easy with kbmMW #4 – Access management

    在前面有关如何使用kbmMW创建REST服务器的基础上,现在已经到了考虑该如何控制用户的访问.什么是访问管理?就是“允许谁做什么"的问题. 显然,这个世界中存在数据,应该保护他而不被未授权的 ...

  9. REST easy with kbmMW #1

    kbmMW 5.0支持REST服务器的开发,并且非常简单,下面看看如何实作一个REST服务器. 首先我们制作一个服务器应用程序,增加一个简单的Form,并放置kbmMW组件. 在Delphi中单击Fi ...

随机推荐

  1. 【译】Asp.net core应用在 Kubernetes上内存使用率过高问题分析

    原文:https://blog.markvincze.com/troubleshooting-high-memory-usage-with-asp-net-core-on-kubernetes/ ps ...

  2. DPDK无法分出大页面:EAL: No free hugepages reported in hugepages-2048kB 解决方法

    参考: [dpdk-users] Fw: DPDK Error --> EAL: No free hugepages reported in hugepages-2048kB DPDK无法分出连 ...

  3. Node.js中package.json中^和~的区别

    webpack 项目的package.json 文件列出了项目所依赖的插件和库,同时也给出了对应的版本说明,但是在版本说明前面还有个符号:'^'(插入符号)和'~'(波浪符号),总结了下他们之间的区别 ...

  4. js分号的重要性

    js中语句末尾可以不加分号, 很多时候在做练习或写几个页面时,我都是不会加的.虽然知道加了会好一点.但就是觉得很敲一句就要多按一次分号键(;)来加分号,而不加也不怎么样,然后就不想加了. 也听说在对j ...

  5. oadrunner11录制手机app脚本

    oadrunner11录制手机app视频:http://pan.baidu.com/s/1bnc4cHL 注意点: 1.手机和loadrunner安装的电脑必须在同一网段2.视频的www.baidu. ...

  6. 用caffe进行图片检索

    1.图片的处理 输入:将自己的图像转换成caffe需要的格式要求:lmdb 或者 leveldb 格式 这里caffe有自己提供的脚本:create_minst.sh 转换训练图片和验证图片的格式,运 ...

  7. shell 杀掉指定进程的服务

    check_results=`ps -ef|grep bp_driver.launch|awk '{print $2}'|sed -n 1p` echo `kill - $check_results` ...

  8. 转载:oracle 11g ADG实施手册(亲测,已成功部署多次)

    https://www.cnblogs.com/yhfssp/p/7815078.html 一:实验环境介绍 虚拟机系统: RHEL Linux 6.4(64位) 数据库版本: Oracle 11gR ...

  9. 简单了解SQL(结构化查询语言)

    简单了解SQL(结构化查询语言) 年10月,美国国家标准学会对SQL进行规范后,以此作为关系式数据库管理系统的标准语言(ANSI X3. 135-1986),1987年得到国际标准组织的支持下成为国际 ...

  10. 爬虫框架pyspider的使用

    j概要:了解了爬虫的基础知识后,接下来我们来使用框架来写爬虫,用框架会使我们写爬虫更加简单,接下来我们来了解一下,pyspider框架的使用,了解了该框架,妈妈再也不用担心我们的学习了. 前期准备: ...