我被问到有关如何通过基于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. HDU 6103 Kirinriki(尺取法)

    http://acm.hdu.edu.cn/showproblem.php?pid=6103 题意: 给出一个字符串,在其中找两串互不重叠的子串,计算它们之间的dis值,要求dis值小于等于m,求能选 ...

  2. Springboot 学习笔记 之 Day 1

    SpringBoot快速入门 https://spring.io/ 1. SpringBoot简介Spring Boot来简化Spring应用开发,约定大于配置,去繁从简,just run就能创建一个 ...

  3. Jmeter 之 ServerAgent 在性能测试的时候通过插件监听数据库状态

    https://jmeter-plugins.org/downloads/old/ 下载几个jar包,导入到Jmeter对应到目录下/lib/ext文件夹下,注意只支持Jmeter3.2(不含)以下版 ...

  4. Index.cshtml”处的视图必须派生自 WebViewPage 或 WebViewPage<TModel>。

    解决方案: 1,在每个视图上面添加 @inherits System.Web.Mvc.WebViewPage 2,将views中的web.config COPY到新的视图模版文件夹下,就可以了

  5. 用Java随机生成四则运算

    代码链接:https://github.com/devilwjy/Code.Demo 需求分析: 1.程序可接收一个输入参数n,然后随机产生n道加减乘除练习题,每个数字在 0 和 100 之间,运算符 ...

  6. 《剑指offer》第十八题(在O(1)时间删除链表结点)

    // 面试题18(一):在O(1)时间删除链表结点 // 题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该 // 结点. #include <iostream> ...

  7. 网站链接facebook 拿新的post

    $http({ method: "GET", url: "https://graph.facebook.com/oauth/access_token?client_id= ...

  8. C++数组引用

    C++数组引用 一.数组引用 C++数组的引用:引用即别名这样比指针传地址方便多了 形参中的(&a)[10]可以就看做a数组的别名,肯定要指定数组大小,如果没有后面的数组大小,天知道是变量还是 ...

  9. C# WPF 利用NPOI读写Excel文件

    https://blog.csdn.net/a312024054/article/details/70139172 [各种样式] https://www.cnblogs.com/xwgli/archi ...

  10. Confluence 6 安装 Active Directory 证书服务器

    如果证书服务器已经安装了的话,跳过这一步骤,直接进入下一步.下面步骤中的屏幕截图是从 Windows 2008 服务器版上安装的截图,针对 2000 和 2003 安装过程是一样的. 作为系统管理员登 ...