我被問到有關如何經過基於kbmMW智能服務(Smart Service)的REST處理POST的問題。json
這篇博客文章解釋了典型的POST各類形式的訪問,以及如何在kbmMW中處理它們。ide
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 一般做爲文件上傳的一部分。
您能夠根據客戶端選擇發送數據的方式,而後在服務端以不一樣方式提取數據。oop
第一種狀況:post
[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;
第三種狀況:spa
[kbmMW_Rest('method:post, path: "myfunction"')] function MyFunction( [kbmMW_Rest('value:body')] ABody:string):string;
而後MyFunctions這樣實現:rest
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;
第四種狀況,有多種方法:code
1.若是數據是已知的,能夠定義一個class來接收數據。component
[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:=0 to mp.Count-1 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/