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

UPS Address Validation (City, State, Zip)

See more HTTP Misc Examples

Demonstrates making a call to the UPS address validation REST API.

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.Http,
  Chilkat.StringBuilder,
  Chilkat.HttpResponse,
  Chilkat.JsonObject;

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

procedure RunDemo;
var
  success: Boolean;
  http: THttp;
  url: string;
  json: TJsonObject;
  sb: TStringBuilder;
  resp: THttpResponse;
  customerContext: string;
  statusCode: string;
  statusDescription: string;
  resultRank: string;
  resultQuality: string;
  city: string;
  provinceCode: string;
  postalCodeLowEnd: string;
  postalCodeHighEnd: string;
  rank: string;
  quality: string;
  addressCity: string;
  addressStateProvinceCode: string;
  numResults: Integer;
  i: Integer;

begin
  success := False;

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

  http := THttp.Create;

  //  This is the testing endpoint for address validation:
  url := 'https://wwwcie.ups.com/rest/AV';

  //  Send an HTTP request with the following JSON body:

  //  {
  //    "AccessRequest": {
  //      "AccessLicenseNumber": "Your Access License Number",
  //      "UserId": "Your Username",
  //      "Password": "Your Password"
  //    },
  //    "AddressValidationRequest": {
  //      "Request": {
  //        "TransactionReference": {
  //          "CustomerContext": "Your Customer Context"
  //        },
  //        "RequestAction": "AV"
  //      },
  //      "Address": {
  //        "City": "ALPHARETTA",
  //        "StateProvinceCode": "GA",
  //        "PostalCode": "30005"
  //      }
  //    }
  //  }

  //  Build the above JSON.
  json := TJsonObject.Create;
  json.UpdateString('AccessRequest.AccessLicenseNumber','UPS_ACCESS_KEY');
  json.UpdateString('AccessRequest.UserId','UPS_USERNAME');
  json.UpdateString('AccessRequest.Password','UPS_PASSWORD');
  json.UpdateString('AddressValidationRequest.Request.TransactionReference.CustomerContext','Your Customer Context');
  json.UpdateString('AddressValidationRequest.Request.RequestAction','AV');
  json.UpdateString('AddressValidationRequest.Address.City','ALPHARETTA');
  //  We're making an intentional mistake here by passing CA instead of GA.
  json.UpdateString('AddressValidationRequest.Address.StateProvinceCode','CA');
  json.UpdateString('AddressValidationRequest.Address.PostalCode','30005');

  sb := TStringBuilder.Create;
  resp := THttpResponse.Create;
  success := http.HttpJson('POST',url,json,'application/json',resp);
  if (success = False) then
    begin
      WriteLn(http.LastErrorText);
      Exit;
    end;

  WriteLn('status = ' + resp.StatusCode);

  //  A 200 response status indicate success.
  if (resp.StatusCode <> 200) then
    begin
      WriteLn(resp.BodyStr);
      WriteLn('Failed.');
      Exit;
    end;

  json.Load(resp.BodyStr);
  json.EmitCompact := False;
  WriteLn(json.Emit());

  //  A successful exact response looks like this:

  //  {
  //    "AddressValidationResponse": {
  //      "Response": {
  //        "TransactionReference": {
  //          "CustomerContext": "Your Customer Context"
  //        },
  //        "ResponseStatusCode": "1",
  //        "ResponseStatusDescription": "Success"
  //      },
  //      "AddressValidationResult": {
  //        "Rank": "1",
  //        "Quality": "1.0",
  //        "Address": {
  //          "City": "ALPHARETTA",
  //          "StateProvinceCode": "GA"
  //        },
  //        "PostalCodeLowEnd": "30005",
  //        "PostalCodeHighEnd": "30005"
  //      }
  //    }
  //  }
  //  

  //  A successful response that was not an exact match provides an array of closest matches, like this:

  //  {
  //    "AddressValidationResponse": {
  //      "Response": {
  //        "TransactionReference": {
  //          "CustomerContext": "Your Customer Context"
  //          "Quality": "0.9875",
  //          "Address": {
  //        },
  //        "ResponseStatusCode": "1",
  //        "ResponseStatusDescription": "Success"
  //      },
  //      "AddressValidationResult": [
  //        {
  //          "Rank": "1",
  //            "City": "ALPHARETTA",
  //            "StateProvinceCode": "GA"
  //          },
  //          "PostalCodeLowEnd": "30005",
  //          "PostalCodeHighEnd": "30005"
  //        },
  //        {
  //          "Rank": "2",
  //          "Quality": "0.9750",
  //          "Address": {
  //            "City": "ALPHARETTA",
  //            "StateProvinceCode": "GA"
  //          },
  //          "PostalCodeLowEnd": "30004",
  //          "PostalCodeHighEnd": "30004"
  //        },
  //        {
  //          "Rank": "3",
  //          "Quality": "0.9750",
  //          "Address": {
  //            "City": "ALPHARETTA",
  //            "StateProvinceCode": "GA"
  //          },
  //          "PostalCodeLowEnd": "30009",
  //          "PostalCodeHighEnd": "30009"
  //        }
  //      ]
  //    }
  //  }

  //  Use the online tool at Generate JSON Parsing Code
  //  to generate JSON parsing code.

  numResults := json.SizeOfArray('AddressValidationResponse.AddressValidationResult');
  if (numResults < 0) then
    begin

      //  Here's parse code for the above JSON exact response:
      customerContext := json.StringOf('AddressValidationResponse.Response.TransactionReference.CustomerContext');
      statusCode := json.StringOf('AddressValidationResponse.Response.ResponseStatusCode');
      statusDescription := json.StringOf('AddressValidationResponse.Response.ResponseStatusDescription');
      resultRank := json.StringOf('AddressValidationResponse.AddressValidationResult.Rank');
      resultQuality := json.StringOf('AddressValidationResponse.AddressValidationResult.Quality');
      city := json.StringOf('AddressValidationResponse.AddressValidationResult.Address.City');
      provinceCode := json.StringOf('AddressValidationResponse.AddressValidationResult.Address.StateProvinceCode');
      postalCodeLowEnd := json.StringOf('AddressValidationResponse.AddressValidationResult.PostalCodeLowEnd');
      postalCodeHighEnd := json.StringOf('AddressValidationResponse.AddressValidationResult.PostalCodeHighEnd');

      WriteLn('Exact match!');
      WriteLn('postal code: ' + postalCodeLowEnd);

    end
  else
    begin

      WriteLn('Non-Exact match.');

      customerContext := json.StringOf('AddressValidationResponse.Response.TransactionReference.CustomerContext');
      statusCode := json.StringOf('AddressValidationResponse.Response.ResponseStatusCode');
      statusDescription := json.StringOf('AddressValidationResponse.Response.ResponseStatusDescription');
      i := 0;
      while i < numResults do
        begin
          json.I := i;
          rank := json.StringOf('AddressValidationResponse.AddressValidationResult[i].Rank');
          WriteLn('rank: ' + rank);
          quality := json.StringOf('AddressValidationResponse.AddressValidationResult[i].Quality');
          addressCity := json.StringOf('AddressValidationResponse.AddressValidationResult[i].Address.City');
          WriteLn('addressCity: ' + addressCity);
          addressStateProvinceCode := json.StringOf('AddressValidationResponse.AddressValidationResult[i].Address.StateProvinceCode');
          postalCodeLowEnd := json.StringOf('AddressValidationResponse.AddressValidationResult[i].PostalCodeLowEnd');
          WriteLn('postal code: ' + postalCodeLowEnd);
          postalCodeHighEnd := json.StringOf('AddressValidationResponse.AddressValidationResult[i].PostalCodeHighEnd');
          i := i + 1;
        end;

    end;


  http.Free;
  json.Free;
  sb.Free;
  resp.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.