BaaS with Kinvey and Delphi 10.1 Berlin
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BaaS with Kinvey and Delphi 10.1 Berlin相关的知识,希望对你有一定的参考价值。
In this article I will show you how to connect yourdesktop and mobile applications to a mobile backend as a service (mBaaS) with Delphi 10.1 Berlin. I normally use Parse.com as a backend but as they announce that they will close their mBaaS service I will use Kinvey instead.
If you are interested in Parse.com you can read my previous articles about creating your own self-hosted Parse server and deploying a Parse server to Herokuwhich achieves similar result to what I want to explain you today (basically having your data hosted anywhere in the cloud either using Kinvey as an mBaaSor Parse + Heroku as a PaaS).
There are plenty of articles online about these topics and I just want to give you my input and how I dealt with some of the challenges I faced during development.
Join Kinvey and create your App environment
First step is to join Kinvey and create your application environment. Kinvey offers a Free plan for developers that it is ideal to test your applications. It includes the core mBaaS features and 1GB of data storage. Once you move your solution into production you can switch over one of the other plans available.
Once you are in the console management, press "New App" and enter the name of your backend:
Now you should see your enviromnent created:
Click on the Development label and the dashboard will be shown:
At this moment in time, you should know what data you are going to store. In this example I have created a simple collection that includes several fields for a sample application that I‘m building and that the source code can be found here:
Here is my collection of values:
*Note that if you POST data to a non-existing collection, this will be created automatically.
Handling collections
Now it‘s time to start using the collection and querying/adding data via Http REST. For this task you will have to identify the required headers that are needed for your GET/POST requests. You can see one example here for Parse.
Kinvey follows a different approach than Parse in terms of security. Kinvey offers basic and session authentiation. Basic authentication uses the HTTP header "Authorization" with the components "Basic" andBase64Encode(AppId:MasterSecret). Session authentication sends a login request to collct an auth token from Kinvey backend and then this token is used in subsequent REST requests.
I will focus on Basic authentication as Session authentication is as simple but with more steps.
The first example is by using REST via IdHttp so you can see how GET/POST are handled manually and the second example is just by using the Kinvey provider component available with our Delphi 10.1 Berlin that will make our life easier.
Here it‘s my Win64 example that uses Kinvey BaaS:
Add action, adds data into the collection and reload just brings the data back from the cloud and displays it in a listview component.
Here is the code behind it:
Add item:
// Copyright (c) 2016, Jordi Corbilla | |
// All rights reserved. | |
// | |
// Redistribution and use in source and binary forms, with or without | |
// modification, are permitted provided that the following conditions are met: | |
// | |
// - Redistributions of source code must retain the above copyright notice, | |
// this list of conditions and the following disclaimer. | |
// - Redistributions in binary form must reproduce the above copyright notice, | |
// this list of conditions and the following disclaimer in the documentation | |
// and/or other materials provided with the distribution. | |
// - Neither the name of this library nor the names of its contributors may be | |
// used to endorse or promote products derived from this software without | |
// specific prior written permission. | |
// | |
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | |
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | |
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | |
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | |
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | |
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | |
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | |
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | |
// POSSIBILITY OF SUCH DAMAGE. | |
function TKinveyRest.Add(jsonString: string) : boolean; | |
var | |
IdHTTP: TIdHTTP; | |
IdIOHandler: TIdSSLIOHandlerSocketOpenSSL; | |
response : string; | |
JsonToSend: TStringStream; | |
encodedHeader : string; | |
begin | |
JsonToSend := TStringStream.Create(jsonString); | |
try | |
IdIOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil); | |
IdIOHandler.ReadTimeout := IdTimeoutInfinite; | |
IdIOHandler.ConnectTimeout := IdTimeoutInfinite; | |
IdHTTP := TIdHTTP.Create(nil); | |
try | |
IdHTTP.IOHandler := IdIOHandler; | |
IdHTTP.Request.Connection := ‘Keep-Alive‘; | |
IdIOHandler.SSLOptions.Method := sslvSSLv23; | |
IdHTTP.Request.CustomHeaders.Clear; | |
encodedHeader := TIdEncoderMIME.EncodeString(FOptions.AppId + ‘:‘ + FOptions.MasterSecret); | |
IdHTTP.Request.CustomHeaders.Values[‘Authorization‘] := ‘Basic ‘ + encodedHeader; | |
IdHTTP.Request.CustomHeaders.Values[‘X-Kinvey-API-Version‘] := ‘3‘; | |
IdHTTP.Request.ContentType := ‘application/json‘; | |
response := IdHTTP.Post(‘https://baas.kinvey.com/appdata/‘+FOptions.AppId+‘/‘+FOptions.Collection+‘/‘, JsonToSend); | |
response := response.Replace(AnsiChar(#10), ‘‘); | |
result := (response.Contains(‘creator‘)); | |
finally | |
IdHTTP.Free; | |
end; | |
finally | |
IdIOHandler.Free; | |
JsonToSend.Free; | |
end; | |
end; |
// Copyright (c) 2016, Jordi Corbilla | |
// All rights reserved. | |
// | |
// Redistribution and use in source and binary forms, with or without | |
// modification, are permitted provided that the following conditions are met: | |
// | |
// - Redistributions of source code must retain the above copyright notice, | |
// this list of conditions and the following disclaimer. | |
// - Redistributions in binary form must reproduce the above copyright notice, | |
// this list of conditions and the following disclaimer in the documentation | |
// and/or other materials provided with the distribution. | |
// - Neither the name of this library nor the names of its contributors may be | |
// used to endorse or promote products derived from this software without | |
// specific prior written permission. | |
// | |
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | |
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | |
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | |
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | |
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | |
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | |
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | |
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | |
// POSSIBILITY OF SUCH DAMAGE. | |
function TKinveyRest.GetCollection: string; | |
var | |
IdHTTP: TIdHTTP; | |
IdIOHandler: TIdSSLIOHandlerSocketOpenSSL; | |
response : string; | |
encodedHeader : string; | |
begin | |
try | |
IdIOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil); | |
IdIOHandler.ReadTimeout := IdTimeoutInfinite; | |
IdIOHandler.ConnectTimeout := IdTimeoutInfinite; | |
IdHTTP := TIdHTTP.Create(nil); | |
try | |
IdHTTP.IOHandler := IdIOHandler; | |
IdHTTP.Request.Connection := ‘Keep-Alive‘; | |
IdIOHandler.SSLOptions.Method := sslvSSLv23; | |
IdHTTP.Request.CustomHeaders.Clear; | |
encodedHeader := TIdEncoderMIME.EncodeString(FOptions.AppId + ‘:‘ + FOptions.MasterSecret); | |
IdHTTP.Request.CustomHeaders.Values[‘Authorization‘] := ‘Basic ‘ + encodedHeader; | |
IdHTTP.Request.CustomHeaders.Values[‘X-Kinvey-API-Version‘] := ‘3‘; | |
IdHTTP.Request.ContentType := ‘application/json‘; | |
response := IdHTTP.Get(‘https://baas.kinvey.com/appdata/‘+FOptions.AppId+‘/‘+FOptions.Collection+‘/‘); | |
result := response; | |
finally | |
IdHTTP.Free; | |
end; | |
finally | |
IdIOHandler.Free; | |
end; | |
end; |
#Example posting to Kinvey via curl | |
>curl -H ‘Content-Type: application/json‘ --user APPKEY:MASTERSECRET -X PUT -d ‘{"user":"user","password":"password","url","www.google.co.uk"}‘ https://baas.kinvey.com/appdata/APPKEY/Websites | |
#Example reading the content of the collection | |
>curl --user APPKEY:MASTERSECRET -X GET https://baas.kinvey.com/appdata/APPKEY/Websites/ -G --data-urlencode ‘order={"user"}‘ |
If you want to run this example successfully you‘ll need to include libeay32.dll and ssleay32.dll from OpenSSL.
You can test this app and its mobile companion app using the source codehere.
Using Kinvey Provider component
Delphi 10.1 Berlin has a KinveyProvider component that we can use directly without having to worry about the request details. You‘ll see below that to do the same as the code sample above we will need just few lines of code:
- AppKey
- AppSecret
- MasterSecret
Then connect the BackEndStorage component to the KinveyProvider component.
Now, here is the code to Add items to the collection and to load the collection via components:
Load Data:
// Copyright (c) 2016, Jordi Corbilla | |
// All rights reserved. | |
// | |
// Redistribution and use in source and binary forms, with or without | |
// modification, are permitted provided that the following conditions are met: | |
// | |
// - Redistributions of source code must retain the above copyright notice, | |
// this list of conditions and the following disclaimer. | |
// - Redistributions in binary form must reproduce the above copyright notice, | |
// this list of conditions and the following disclaimer in the documentation | |
// and/or other materials provided with the distribution. | |
// - Neither the name of this library nor the names of its contributors may be | |
// used to endorse or promote products derived from this software without | |
// specific prior written permission. | |
// | |
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | |
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | |
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | |
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | |
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | |
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | |
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | |
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | |
// POSSIBILITY OF SUCH DAMAGE. | |
function TForm2.GetCollection() : TList<TUrls>; | |
var | |
list: TList<TUrls>; | |
url: TUrls; | |
begin | |
try | |
FBackendList := CreateUrlsList(BackendStorage1.Provider.ProviderID, BackendStorage1.Storage); | |
list := TList<TUrls>.Create; | |
try | |
for url in FBackendList do | |
list.Add(url); | |
except | |
list.Free; | |
raise; | |
end; | |
finally | |
result := list; | |
end; | |
end; | |
function TForm2.CreateUrlsList(const AProviderID: string; const AStorage: TBackendStorageApi): TBackendObjectList<TUrls>; | |
var | |
LQuery: TArray<string>; | |
LContactList: TBackendObjectList<TUrls>; | |
begin | |
LContactList := TBackendObjectList<TUrls>.Create; | |
try | |
LQuery := TArray<string>.Create(Format(‘order=%s‘, [‘user‘])); | |
AStorage.QueryObjects<TUrls>(‘websites‘, LQuery, LContactList); | |
except | |
LContactList.Free; | |
raise; | |
end; | |
Result := LContactList; | |
end; |
// Copyright (c) 2016, Jordi Corbilla | |
// All rights reserved. | |
// | |
// Redistribution and use in source and binary forms, with or without | |
// modification, are permitted provided that the following conditions are met: | |
// | |
// - Redistributions of source code must retain the above copyright notice, | |
& |
以上是关于BaaS with Kinvey and Delphi 10.1 Berlin的主要内容,如果未能解决你的问题,请参考以下文章
Android KInvey 如何在单个查询中从多个集合中查询详细信息
List的Select 和Select().tolist()
Simple and Effective Few-Shot Named Entity Recognition with Structured Nearest Neighbor Learning