Sample code for 30+ languages & platforms
Pascal (Lazarus/Delphi)

Amazon Cognito - Create User Pool

See more Amazon Cognito Examples

Creates a new Amazon Cognito user pool and sets the password policy for the pool.

Chilkat Pascal (Lazarus/Delphi) Downloads

Pascal (Lazarus/Delphi)
program ChilkatDemo;

// Demonstrates using the Chilkat Pascal wrapper via the C bridge DLL.
// Builds as a console application under Lazarus (FPC) or Delphi.

{$IFDEF FPC}
  {$MODE DELPHI}
{$ENDIF}
{$APPTYPE CONSOLE}

uses
  {$IFDEF UNIX}
  cthreads,
  {$ENDIF}
  SysUtils,
  CkDllLoader,
  Chilkat.AuthAws,
  Chilkat.Rest,
  Chilkat.JsonObject,
  Chilkat.StringBuilder;

// ---------------------------------------------------------------------------

procedure RunDemo;
var
  success: Boolean;
  rest: TRest;
  authAws: TAuthAws;
  bTls: Boolean;
  port: Integer;
  bAutoReconnect: Boolean;
  json: TJsonObject;
  sbRequestBody: TStringBuilder;
  sbResponseBody: TStringBuilder;
  respStatusCode: Integer;
  jsonResponse: TJsonObject;

begin
  success := False;

  //  This example requires the Chilkat API to have been previously unlocked.
  //  See Global Unlock Sample for sample code.

  rest := TRest.Create;

  authAws := TAuthAws.Create;
  authAws.AccessKey := 'AWS_ACCESS_KEY';
  authAws.SecretKey := 'AWS_SECRET_KEY';
  //  Don't forget to change the region to your particular region. (Also make the same change in the call to Connect below.)
  authAws.Region := 'us-west-2';
  authAws.ServiceName := 'cognito-idp';
  //  SetAuthAws causes Chilkat to automatically add the following headers: Authorization, X-Amz-Date
  rest.SetAuthAws(authAws);

  //  URL: https://cognito-idp.us-west-2.amazonaws.com/
  bTls := True;
  port := 443;
  bAutoReconnect := True;
  //  Use the same region as specified above.
  success := rest.Connect('cognito-idp.us-west-2.amazonaws.com',port,bTls,bAutoReconnect);
  if (success <> True) then
    begin
      WriteLn('ConnectFailReason: ' + rest.ConnectFailReason);
      WriteLn(rest.LastErrorText);
      Exit;
    end;

  //  Note: The above code does not need to be repeatedly called for each REST request.
  //  The rest object can be setup once, and then many requests can be sent.  Chilkat will automatically
  //  reconnect within a FullRequest* method as needed.  It is only the very first connection that is explicitly
  //  made via the Connect method.

  //  Use this online tool to generate code from sample JSON:
  //  Generate Code to Create JSON

  //  The following JSON is sent in the request body.
  //  This example wil demonstrate creating a pool with many options specified.
  //  The only required JSON member is "PoolName".

  //  {
  //      "AccountRecoverySetting": {
  //        "RecoveryMechanisms": [
  //          {
  //            "Name": "verified_phone_number",
  //            "Priority": 1
  //          },
  //          {
  //            "Name": "verified_email",
  //            "Priority": 2
  //          }
  //        ]
  //      },
  //      "AdminCreateUserConfig": {
  //        "AllowAdminCreateUserOnly": false,
  //        "InviteMessageTemplate": {
  //          "EmailMessage": "Your username is {username} and temporary password is {####}. ",
  //          "EmailSubject": "Your temporary password",
  //          "SMSMessage": "Your username is {username} and temporary password is {####}. "
  //        },
  //        "TemporaryPasswordValidityDays": 7
  //      },
  //      "AutoVerifiedAttributes": [
  //        "email",
  //        "phone_number"
  //      ],
  //      "EmailConfiguration": {
  //        "EmailSendingAccount": "DEVELOPER",
  //        "From": "joe@example.com",
  //        "ReplyToEmailAddress": "joe@example.com",
  //        "SourceArn": "arn:aws:ses:us-west-2:954491834127:identity/joe@example.com"
  //      },
  //      "EmailVerificationMessage": "Your verification code is {####}. ",
  //      "EmailVerificationSubject": "Your verification code",
  //      "LambdaConfig": {},
  //      "MfaConfiguration": "OFF",
  //      "PoolName": "MyTestPool",
  //      "Policies": {
  //        "PasswordPolicy": {
  //          "MinimumLength": 8,
  //          "RequireLowercase": true,
  //          "RequireNumbers": true,
  //          "RequireSymbols": true,
  //          "RequireUppercase": true,
  //          "TemporaryPasswordValidityDays": 7
  //        }
  //      },
  //      "Schema": [
  //        {
  //          "AttributeDataType": "String",
  //          "DeveloperOnlyAttribute": false,
  //          "Mutable": false,
  //          "Name": "sub",
  //          "Required": true,
  //          "StringAttributeConstraints": {
  //            "MaxLength": "2048",
  //            "MinLength": "1"
  //          }
  //        },
  //        {
  //          "AttributeDataType": "String",
  //          "DeveloperOnlyAttribute": false,
  //          "Mutable": true,
  //          "Name": "name",
  //          "Required": false,
  //          "StringAttributeConstraints": {
  //            "MaxLength": "2048",
  //            "MinLength": "0"
  //          }
  //        },
  //        {
  //          "AttributeDataType": "String",
  //          "DeveloperOnlyAttribute": false,
  //          "Mutable": true,
  //          "Name": "given_name",
  //          "Required": false,
  //          "StringAttributeConstraints": {
  //            "MaxLength": "2048",
  //            "MinLength": "0"
  //          }
  //        },
  //        {
  //          "AttributeDataType": "String",
  //          "DeveloperOnlyAttribute": false,
  //          "Mutable": true,
  //          "Name": "family_name",
  //          "Required": false,
  //          "StringAttributeConstraints": {
  //            "MaxLength": "2048",
  //            "MinLength": "0"
  //          }
  //        },
  //        {
  //          "AttributeDataType": "String",
  //          "DeveloperOnlyAttribute": false,
  //          "Mutable": true,
  //          "Name": "middle_name",
  //          "Required": false,
  //          "StringAttributeConstraints": {
  //            "MaxLength": "2048",
  //            "MinLength": "0"
  //          }
  //        },
  //        {
  //          "AttributeDataType": "String",
  //          "DeveloperOnlyAttribute": false,
  //          "Mutable": true,
  //          "Name": "nickname",
  //          "Required": false,
  //          "StringAttributeConstraints": {
  //            "MaxLength": "2048",
  //            "MinLength": "0"
  //          }
  //        },
  //        {
  //          "AttributeDataType": "String",
  //          "DeveloperOnlyAttribute": false,
  //          "Mutable": true,
  //          "Name": "preferred_username",
  //          "Required": false,
  //          "StringAttributeConstraints": {
  //            "MaxLength": "2048",
  //            "MinLength": "0"
  //          }
  //        },
  //        {
  //          "AttributeDataType": "String",
  //          "DeveloperOnlyAttribute": false,
  //          "Mutable": true,
  //          "Name": "profile",
  //          "Required": false,
  //          "StringAttributeConstraints": {
  //            "MaxLength": "2048",
  //            "MinLength": "0"
  //          }
  //        },
  //        {
  //          "AttributeDataType": "String",
  //          "DeveloperOnlyAttribute": false,
  //          "Mutable": true,
  //          "Name": "picture",
  //          "Required": false,
  //          "StringAttributeConstraints": {
  //            "MaxLength": "2048",
  //            "MinLength": "0"
  //          }
  //        },
  //        {
  //          "AttributeDataType": "String",
  //          "DeveloperOnlyAttribute": false,
  //          "Mutable": true,
  //          "Name": "website",
  //          "Required": false,
  //          "StringAttributeConstraints": {
  //            "MaxLength": "2048",
  //            "MinLength": "0"
  //          }
  //        },
  //        {
  //          "AttributeDataType": "String",
  //          "DeveloperOnlyAttribute": false,
  //          "Mutable": true,
  //          "Name": "email",
  //          "Required": true,
  //          "StringAttributeConstraints": {
  //            "MaxLength": "2048",
  //            "MinLength": "0"
  //          }
  //        },
  //        {
  //          "AttributeDataType": "Boolean",
  //          "DeveloperOnlyAttribute": false,
  //          "Mutable": true,
  //          "Name": "email_verified",
  //          "Required": false
  //        },
  //        {
  //          "AttributeDataType": "String",
  //          "DeveloperOnlyAttribute": false,
  //          "Mutable": true,
  //          "Name": "gender",
  //          "Required": false,
  //          "StringAttributeConstraints": {
  //            "MaxLength": "2048",
  //            "MinLength": "0"
  //          }
  //        },
  //        {
  //          "AttributeDataType": "String",
  //          "DeveloperOnlyAttribute": false,
  //          "Mutable": true,
  //          "Name": "birthdate",
  //          "Required": false,
  //          "StringAttributeConstraints": {
  //            "MaxLength": "10",
  //            "MinLength": "10"
  //          }
  //        },
  //        {
  //          "AttributeDataType": "String",
  //          "DeveloperOnlyAttribute": false,
  //          "Mutable": true,
  //          "Name": "zoneinfo",
  //          "Required": false,
  //          "StringAttributeConstraints": {
  //            "MaxLength": "2048",
  //            "MinLength": "0"
  //          }
  //        },
  //        {
  //          "AttributeDataType": "String",
  //          "DeveloperOnlyAttribute": false,
  //          "Mutable": true,
  //          "Name": "locale",
  //          "Required": false,
  //          "StringAttributeConstraints": {
  //            "MaxLength": "2048",
  //            "MinLength": "0"
  //          }
  //        },
  //        {
  //          "AttributeDataType": "String",
  //          "DeveloperOnlyAttribute": false,
  //          "Mutable": true,
  //          "Name": "phone_number",
  //          "Required": false,
  //          "StringAttributeConstraints": {
  //            "MaxLength": "2048",
  //            "MinLength": "0"
  //          }
  //        },
  //        {
  //          "AttributeDataType": "String",
  //          "DeveloperOnlyAttribute": false,
  //          "Mutable": true,
  //          "Name": "address",
  //          "Required": false,
  //          "StringAttributeConstraints": {
  //            "MaxLength": "2048",
  //            "MinLength": "0"
  //          }
  //        },
  //        {
  //          "AttributeDataType": "Number",
  //          "DeveloperOnlyAttribute": false,
  //          "Mutable": true,
  //          "Name": "updated_at",
  //          "NumberAttributeConstraints": {
  //            "MinValue": "0"
  //          },
  //          "Required": false
  //        }
  //      ],
  //      "SmsAuthenticationMessage": "Your verification code is {####}. ",
  //      "SmsConfiguration": {
  //        "ExternalId": "94b17737-216b-4cf7-a29e-17e990e91300",
  //        "SnsCallerArn": "arn:aws:iam::954491834127:role/service-role/chilkat-SMS-Role"
  //      },
  //      "SmsVerificationMessage": "Your verification code is {####}. ",
  //      "UsernameConfiguration": {
  //        "CaseSensitive": false
  //      },
  //      "VerificationMessageTemplate": {
  //        "DefaultEmailOption": "CONFIRM_WITH_CODE",
  //        "EmailMessage": "Your verification code is {####}. ",
  //        "EmailSubject": "Your verification code",
  //        "SmsMessage": "Your verification code is {####}. "
  //      }
  //    }
  //  

  json := TJsonObject.Create;
  json.UpdateString('AccountRecoverySetting.RecoveryMechanisms[0].Name','verified_phone_number');
  json.UpdateInt('AccountRecoverySetting.RecoveryMechanisms[0].Priority',1);
  json.UpdateString('AccountRecoverySetting.RecoveryMechanisms[1].Name','verified_email');
  json.UpdateInt('AccountRecoverySetting.RecoveryMechanisms[1].Priority',2);
  json.UpdateBool('AdminCreateUserConfig.AllowAdminCreateUserOnly',False);
  json.UpdateString('AdminCreateUserConfig.InviteMessageTemplate.EmailMessage','Your username is {username} and temporary password is {####}. ');
  json.UpdateString('AdminCreateUserConfig.InviteMessageTemplate.EmailSubject','Your temporary password');
  json.UpdateString('AdminCreateUserConfig.InviteMessageTemplate.SMSMessage','Your username is {username} and temporary password is {####}. ');
  json.UpdateInt('AdminCreateUserConfig.TemporaryPasswordValidityDays',7);
  json.UpdateString('AutoVerifiedAttributes[0]','email');
  json.UpdateString('AutoVerifiedAttributes[1]','phone_number');
  json.UpdateString('EmailConfiguration.EmailSendingAccount','DEVELOPER');
  json.UpdateString('EmailConfiguration.From','joe@example.com');
  json.UpdateString('EmailConfiguration.ReplyToEmailAddress','joe@example.com');
  json.UpdateString('EmailConfiguration.SourceArn','arn:aws:ses:us-west-2:954491834127:identity/joe@example.com');
  json.UpdateString('EmailVerificationMessage','Your verification code is {####}. ');
  json.UpdateString('EmailVerificationSubject','Your verification code');
  json.UpdateNewObject('LambdaConfig');
  json.UpdateString('MfaConfiguration','OFF');
  json.UpdateString('PoolName','MyTestPool');
  json.UpdateInt('Policies.PasswordPolicy.MinimumLength',8);
  json.UpdateBool('Policies.PasswordPolicy.RequireLowercase',True);
  json.UpdateBool('Policies.PasswordPolicy.RequireNumbers',True);
  json.UpdateBool('Policies.PasswordPolicy.RequireSymbols',True);
  json.UpdateBool('Policies.PasswordPolicy.RequireUppercase',True);
  json.UpdateInt('Policies.PasswordPolicy.TemporaryPasswordValidityDays',7);
  json.UpdateString('Schema[0].AttributeDataType','String');
  json.UpdateBool('Schema[0].DeveloperOnlyAttribute',False);
  json.UpdateBool('Schema[0].Mutable',False);
  json.UpdateString('Schema[0].Name','sub');
  json.UpdateBool('Schema[0].Required',True);
  json.UpdateString('Schema[0].StringAttributeConstraints.MaxLength','2048');
  json.UpdateString('Schema[0].StringAttributeConstraints.MinLength','1');
  json.UpdateString('Schema[1].AttributeDataType','String');
  json.UpdateBool('Schema[1].DeveloperOnlyAttribute',False);
  json.UpdateBool('Schema[1].Mutable',True);
  json.UpdateString('Schema[1].Name','name');
  json.UpdateBool('Schema[1].Required',False);
  json.UpdateString('Schema[1].StringAttributeConstraints.MaxLength','2048');
  json.UpdateString('Schema[1].StringAttributeConstraints.MinLength','0');
  json.UpdateString('Schema[2].AttributeDataType','String');
  json.UpdateBool('Schema[2].DeveloperOnlyAttribute',False);
  json.UpdateBool('Schema[2].Mutable',True);
  json.UpdateString('Schema[2].Name','given_name');
  json.UpdateBool('Schema[2].Required',False);
  json.UpdateString('Schema[2].StringAttributeConstraints.MaxLength','2048');
  json.UpdateString('Schema[2].StringAttributeConstraints.MinLength','0');
  json.UpdateString('Schema[3].AttributeDataType','String');
  json.UpdateBool('Schema[3].DeveloperOnlyAttribute',False);
  json.UpdateBool('Schema[3].Mutable',True);
  json.UpdateString('Schema[3].Name','family_name');
  json.UpdateBool('Schema[3].Required',False);
  json.UpdateString('Schema[3].StringAttributeConstraints.MaxLength','2048');
  json.UpdateString('Schema[3].StringAttributeConstraints.MinLength','0');
  json.UpdateString('Schema[4].AttributeDataType','String');
  json.UpdateBool('Schema[4].DeveloperOnlyAttribute',False);
  json.UpdateBool('Schema[4].Mutable',True);
  json.UpdateString('Schema[4].Name','middle_name');
  json.UpdateBool('Schema[4].Required',False);
  json.UpdateString('Schema[4].StringAttributeConstraints.MaxLength','2048');
  json.UpdateString('Schema[4].StringAttributeConstraints.MinLength','0');
  json.UpdateString('Schema[5].AttributeDataType','String');
  json.UpdateBool('Schema[5].DeveloperOnlyAttribute',False);
  json.UpdateBool('Schema[5].Mutable',True);
  json.UpdateString('Schema[5].Name','nickname');
  json.UpdateBool('Schema[5].Required',False);
  json.UpdateString('Schema[5].StringAttributeConstraints.MaxLength','2048');
  json.UpdateString('Schema[5].StringAttributeConstraints.MinLength','0');
  json.UpdateString('Schema[6].AttributeDataType','String');
  json.UpdateBool('Schema[6].DeveloperOnlyAttribute',False);
  json.UpdateBool('Schema[6].Mutable',True);
  json.UpdateString('Schema[6].Name','preferred_username');
  json.UpdateBool('Schema[6].Required',False);
  json.UpdateString('Schema[6].StringAttributeConstraints.MaxLength','2048');
  json.UpdateString('Schema[6].StringAttributeConstraints.MinLength','0');
  json.UpdateString('Schema[7].AttributeDataType','String');
  json.UpdateBool('Schema[7].DeveloperOnlyAttribute',False);
  json.UpdateBool('Schema[7].Mutable',True);
  json.UpdateString('Schema[7].Name','profile');
  json.UpdateBool('Schema[7].Required',False);
  json.UpdateString('Schema[7].StringAttributeConstraints.MaxLength','2048');
  json.UpdateString('Schema[7].StringAttributeConstraints.MinLength','0');
  json.UpdateString('Schema[8].AttributeDataType','String');
  json.UpdateBool('Schema[8].DeveloperOnlyAttribute',False);
  json.UpdateBool('Schema[8].Mutable',True);
  json.UpdateString('Schema[8].Name','picture');
  json.UpdateBool('Schema[8].Required',False);
  json.UpdateString('Schema[8].StringAttributeConstraints.MaxLength','2048');
  json.UpdateString('Schema[8].StringAttributeConstraints.MinLength','0');
  json.UpdateString('Schema[9].AttributeDataType','String');
  json.UpdateBool('Schema[9].DeveloperOnlyAttribute',False);
  json.UpdateBool('Schema[9].Mutable',True);
  json.UpdateString('Schema[9].Name','website');
  json.UpdateBool('Schema[9].Required',False);
  json.UpdateString('Schema[9].StringAttributeConstraints.MaxLength','2048');
  json.UpdateString('Schema[9].StringAttributeConstraints.MinLength','0');
  json.UpdateString('Schema[10].AttributeDataType','String');
  json.UpdateBool('Schema[10].DeveloperOnlyAttribute',False);
  json.UpdateBool('Schema[10].Mutable',True);
  json.UpdateString('Schema[10].Name','email');
  json.UpdateBool('Schema[10].Required',True);
  json.UpdateString('Schema[10].StringAttributeConstraints.MaxLength','2048');
  json.UpdateString('Schema[10].StringAttributeConstraints.MinLength','0');
  json.UpdateString('Schema[11].AttributeDataType','Boolean');
  json.UpdateBool('Schema[11].DeveloperOnlyAttribute',False);
  json.UpdateBool('Schema[11].Mutable',True);
  json.UpdateString('Schema[11].Name','email_verified');
  json.UpdateBool('Schema[11].Required',False);
  json.UpdateString('Schema[12].AttributeDataType','String');
  json.UpdateBool('Schema[12].DeveloperOnlyAttribute',False);
  json.UpdateBool('Schema[12].Mutable',True);
  json.UpdateString('Schema[12].Name','gender');
  json.UpdateBool('Schema[12].Required',False);
  json.UpdateString('Schema[12].StringAttributeConstraints.MaxLength','2048');
  json.UpdateString('Schema[12].StringAttributeConstraints.MinLength','0');
  json.UpdateString('Schema[13].AttributeDataType','String');
  json.UpdateBool('Schema[13].DeveloperOnlyAttribute',False);
  json.UpdateBool('Schema[13].Mutable',True);
  json.UpdateString('Schema[13].Name','birthdate');
  json.UpdateBool('Schema[13].Required',False);
  json.UpdateString('Schema[13].StringAttributeConstraints.MaxLength','10');
  json.UpdateString('Schema[13].StringAttributeConstraints.MinLength','10');
  json.UpdateString('Schema[14].AttributeDataType','String');
  json.UpdateBool('Schema[14].DeveloperOnlyAttribute',False);
  json.UpdateBool('Schema[14].Mutable',True);
  json.UpdateString('Schema[14].Name','zoneinfo');
  json.UpdateBool('Schema[14].Required',False);
  json.UpdateString('Schema[14].StringAttributeConstraints.MaxLength','2048');
  json.UpdateString('Schema[14].StringAttributeConstraints.MinLength','0');
  json.UpdateString('Schema[15].AttributeDataType','String');
  json.UpdateBool('Schema[15].DeveloperOnlyAttribute',False);
  json.UpdateBool('Schema[15].Mutable',True);
  json.UpdateString('Schema[15].Name','locale');
  json.UpdateBool('Schema[15].Required',False);
  json.UpdateString('Schema[15].StringAttributeConstraints.MaxLength','2048');
  json.UpdateString('Schema[15].StringAttributeConstraints.MinLength','0');
  json.UpdateString('Schema[16].AttributeDataType','String');
  json.UpdateBool('Schema[16].DeveloperOnlyAttribute',False);
  json.UpdateBool('Schema[16].Mutable',True);
  json.UpdateString('Schema[16].Name','phone_number');
  json.UpdateBool('Schema[16].Required',False);
  json.UpdateString('Schema[16].StringAttributeConstraints.MaxLength','2048');
  json.UpdateString('Schema[16].StringAttributeConstraints.MinLength','0');
  json.UpdateString('Schema[17].AttributeDataType','String');
  json.UpdateBool('Schema[17].DeveloperOnlyAttribute',False);
  json.UpdateBool('Schema[17].Mutable',True);
  json.UpdateString('Schema[17].Name','address');
  json.UpdateBool('Schema[17].Required',False);
  json.UpdateString('Schema[17].StringAttributeConstraints.MaxLength','2048');
  json.UpdateString('Schema[17].StringAttributeConstraints.MinLength','0');
  json.UpdateString('Schema[18].AttributeDataType','Number');
  json.UpdateBool('Schema[18].DeveloperOnlyAttribute',False);
  json.UpdateBool('Schema[18].Mutable',True);
  json.UpdateString('Schema[18].Name','updated_at');
  json.UpdateString('Schema[18].NumberAttributeConstraints.MinValue','0');
  json.UpdateBool('Schema[18].Required',False);
  json.UpdateString('SmsAuthenticationMessage','Your verification code is {####}. ');

  //  Use your own value here:
  json.UpdateString('SmsConfiguration.ExternalId','94b17737-216b-4cf7-a29e-17e990e91300');
  json.UpdateString('SmsConfiguration.SnsCallerArn','arn:aws:iam::954491834127:role/service-role/chilkat-SMS-Role');

  json.UpdateString('SmsVerificationMessage','Your verification code is {####}. ');
  json.UpdateBool('UsernameConfiguration.CaseSensitive',False);
  json.UpdateString('VerificationMessageTemplate.DefaultEmailOption','CONFIRM_WITH_CODE');
  json.UpdateString('VerificationMessageTemplate.EmailMessage','Your verification code is {####}. ');
  json.UpdateString('VerificationMessageTemplate.EmailSubject','Your verification code');
  json.UpdateString('VerificationMessageTemplate.SmsMessage','Your verification code is {####}. ');

  rest.AddHeader('Content-Type','application/x-amz-json-1.0');
  rest.AddHeader('X-Amz-Target','AWSCognitoIdentityProviderService.CreateUserPool');
  rest.AddHeader('Accept-Encoding','identity');

  sbRequestBody := TStringBuilder.Create;
  json.EmitSb(sbRequestBody);
  sbResponseBody := TStringBuilder.Create;
  success := rest.FullRequestSb('POST','/',sbRequestBody,sbResponseBody);
  if (success <> True) then
    begin
      WriteLn(rest.LastErrorText);
      Exit;
    end;
  respStatusCode := rest.ResponseStatusCode;
  WriteLn('response status code = ' + respStatusCode);
  if (respStatusCode <> 200) then
    begin
      WriteLn('Response Status Code = ' + respStatusCode);
      WriteLn('Response Header:');
      WriteLn(rest.ResponseHeader);
      WriteLn('Response Body:');
      WriteLn(sbResponseBody.GetAsString());
      Exit;
    end;

  jsonResponse := TJsonObject.Create;
  jsonResponse.LoadSb(sbResponseBody);

  jsonResponse.EmitCompact := False;
  WriteLn(jsonResponse.Emit());

  //  The response is similar to the response at Cognito Describe User Pool


  rest.Free;
  authAws.Free;
  json.Free;
  sbRequestBody.Free;
  sbResponseBody.Free;
  jsonResponse.Free;

end;

// ---------------------------------------------------------------------------

begin

  try
    RunDemo;
  except
    on E: Exception do
      WriteLn('Unhandled exception: ', E.ClassName, ': ', E.Message);
  end;

  WriteLn;
  {$IFDEF MSWINDOWS}
  WriteLn('Press Enter to exit...');
  ReadLn;
  {$ENDIF}
end.