我被问到有关如何通过基于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. js中可以直接使用id而不用获取id

    先来看一个例子: 不获取 id 也可以使用 id 元素. <!-- Author: XiaoWen Create a file: 2017-01-11 13:58:01 Last modifie ...

  2. JS进阶系列之内存空间

    也许很多人像我一样,觉得JS有垃圾回收机制,内存就可以不管了,以至于在全局作用域下定义了很多变量,自以为JS会自动回收,直到最近,看了阮一峰老师,关于javascript内存泄漏的文章时,才发现自己写 ...

  3. Nmap从探测到漏洞利用备忘录 – Nmap简介(一)

    在侦查期间,扫描一直是信息收集的初始阶段. 什么是侦查 侦查是尽可能多收集关于目标网络的信息.从黑客的角度来看,信息收集对于一次攻击非常有用,所以为了封锁恶意的企图,渗透测试者通常尽力查找这些信息,发 ...

  4. java List中相同的数据合并到一起

    值好最后一天岗,写个小程序 List<Map<Object,Object>> mapList = new ArrayList<Map<Object,Object&g ...

  5. API接口自动化之1 常见的http请求

    常见的HTTP请求 就我所想到的,目前如果想做http/https请求接口自动户化,要处理的一些区别 get请求post请求 httphttps 单个值键值对键值对的搭配方式 POST请求体,后续讲一 ...

  6. ZC_C++类函数指针_模拟_Delphi类函数指针

    ZC: C++的类函数指针 不像 Delphi的类函数指针,前者 需要规定死 是哪个类的函数的指针,后者就不需要 很灵活. 测试环境: Win7x64 cn_visual_studio_2010_ul ...

  7. 《A_Pancers团队》作业5—团队项目需求改进与系统设计

    一:团队项目需求改进 1. <音乐播放软件需求规格说明书>的不足 在上周的<音乐播放软件需求规格说明书>我们还需要改进的地方有:1.搜索功能:2.界面的简洁美观化:3.按键的重 ...

  8. Android提高第九篇之GridView和SQLite实现分页表格

    实现并封装一个SQL分页表格控件,不仅支持分页还是以表格的形式展示数据.先来看看本文程序运行的动画: 这个SQL分页表格控件主要分为“表格区”和“分页栏”这两部分,这两部分都是基于GridView实现 ...

  9. PHP自带调试函数

    1.var_dump:打印变量的相关信息 $a = array(1, 2, array("a", "b", "c")); var_dump( ...

  10. 1.python+selenium利用cookie,跳过验证码直接登录

    方法1 在登录时,叫代码等待一段时间,然后手动输入验证码 # coding:utf-8 from selenium import webdriver import time url = 'http:/ ...