



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; |
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 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; |
As you can see, each method uses a POST/GET command to baas.kinvey url with some arguments, headers and options. I find this way really useful as you can clearly see what's going on and easily map what you could do via curl:
#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:

The KinveyProvider needs the parameters:
- AppKey
- AppSecret
- MasterSecret
Get those from the Kinvey dashboard and off you go.
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; |
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. | |
procedure TForm2.btnAddClick(Sender: TObject); | |
var | |
url : TUrls; | |
entity: TBackendEntityValue; | |
begin | |
url := TURls.Create(edit1.Text, edit2.Text, edit3.Text); | |
BackendStorage1.Storage.CreateObject<TUrls>('websites', url, entity); | |
end; |
As you can see now it's way simpler.
And here my android app up and running:

Now I have a Win64 app and an Android app that share the same back end usingKinvey BaaS.
And the data in Kinvey:

Although this article it's quite long I'm sure you will find it quite interesting if you still haven't played with these components and the cloud.
Note that this BackEnd service will cease to exist shortly (as the appkey is hardcoded in the android app and the source code is available).
Do not hesitate to contact me if you have any questions.
http://www.delphifeeds.com/go/s/134494