Sample code for 30+ languages & platforms
Tcl

UPS Tracking API

See more HTTP Misc Examples

Demonstrates making a call to the UPS tracking REST API. Parses the tracking response and extracts the base64 signature image to a gif file.

Chilkat Tcl Downloads

Tcl

load ./chilkat.dll

set success 0

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

set http [new_CkHttp]

# This is the testing endpoint for the tracking API:
set url "https://wwwcie.ups.com/rest/Track"

# Send an HTTP request with the following JSON body:

# {
#   "UPSSecurity": {
#     "UsernameToken": {
#       "Username": "Your Username",
#       "Password": "Your Password"
#     },
#     "ServiceAccessToken": {
#       "AccessLicenseNumber": "Your Access License Number"
#     }
#   },
#   "TrackRequest": {
#     "Request": {
#       "RequestOption": "1",
#       "TransactionReference": {
#         "CustomerContext": "Your Test Case Summary Description"
#       }
#     },
#     "InquiryNumber": "YourTrackingNumber"
#   }
# }
# 

# Build the above JSON.
set json [new_CkJsonObject]

CkJsonObject_UpdateString $json "UPSSecurity.UsernameToken.Username" "UPS_USERNAME"
CkJsonObject_UpdateString $json "UPSSecurity.UsernameToken.Password" "UPS_PASSWORD"
CkJsonObject_UpdateString $json "UPSSecurity.ServiceAccessToken.AccessLicenseNumber" "UPS_ACCESS_KEY"
# Request all activity...
CkJsonObject_UpdateString $json "TrackRequest.Request.RequestOption" "activity"
CkJsonObject_UpdateString $json "TrackRequest.Request.TransactionReference.CustomerContext" "Your Test Case Summary Description"
CkJsonObject_UpdateString $json "TrackRequest.InquiryNumber" "1Z12345E0205271688"

set sb [new_CkStringBuilder]

set resp [new_CkHttpResponse]

set success [CkHttp_HttpJson $http "POST" $url $json "application/json" $resp]
if {$success == 0} then {
    puts [CkHttp_lastErrorText $http]
    delete_CkHttp $http
    delete_CkJsonObject $json
    delete_CkStringBuilder $sb
    delete_CkHttpResponse $resp
    exit
}

puts "status = [CkHttpResponse_get_StatusCode $resp]"

# A 200 response status indicate success.
if {[CkHttpResponse_get_StatusCode $resp] != 200} then {
    puts [CkHttpResponse_bodyStr $resp]
    puts "Failed."
    delete_CkHttp $http
    delete_CkJsonObject $json
    delete_CkStringBuilder $sb
    delete_CkHttpResponse $resp
    exit
}

CkJsonObject_Load $json [CkHttpResponse_bodyStr $resp]
CkJsonObject_put_EmitCompact $json 0
puts [CkJsonObject_emit $json]

# {
#   "TrackResponse": {
#     "Response": {
#       "ResponseStatus": {
#         "Code": "1",
#         "Description": "Success"
#       },
#       "TransactionReference": {
#         "CustomerContext": "Your Test Case Summary Description"
#       }
#     },
#     "Shipment": {
#       "InquiryNumber": {
#         "Code": "01",
#         "Description": "ShipmentIdentificationNumber",
#         "Value": "1Z12345E0205271688"
#       },
#       "ShipmentType": {
#         "Code": "01",
#         "Description": "Small Package"
#       },
#       "ShipperNumber": "12345E",
#       "Service": {
#         "Code": "002",
#         "Description": "2ND DAY AIR"
#       },
#       "ReferenceNumber": {
#         "Code": "01",
#         "Value": "LINE4AND115"
#       },
#       "PickupDate": "19990608",
#       "Package": {
#         "TrackingNumber": "1Z12345E0205271688",
#         "Activity": [
#           {
#             "ActivityLocation": {
#               "Address": {
#                 "City": "ANYTOWN",
#                 "StateProvinceCode": "GA",
# 
#                 "PostalCode": "30340",
#                 "CountryCode": "US"
#               },
#               "Code": "ML",
#               "Description": "BACK DOOR",
#               "SignedForByName": "JOHN DOE"
#             },
#             "Status": {
#               "Type": "D",
#               "Description": "DELIVERED",
#               "Code": "KM"
#             },
#             "Date": "19990610",
#             "Time": "120000",
#             "Document": {
#               "Type": {
#                 "Code": "01",
#                 "Description": "Signature Image"
#               },
#               "Content": "R0lGODdhoA ... JU9Y8RdHsRKLMVJ4MVDMREAAADs=",
#               "Format": {
#                 "Code": "01",
#                 "Description": "GIF"
#               }
#             }
#           },
#           {
#             "Status": {
#               "Type": "M",
#               "Description": "BILLING INFORMATION RECEIVED. SHIPMENT DATE PENDING.",
#               "Code": "MP"
#             },
#             "Date": "19990608",
#             "Time": "120000"
#           }
#         ],
#         "PackageWeight": {
#           "UnitOfMeasurement": {
#             "Code": "LBS"
#           },
#           "Weight": "5.00"
#         },
#         "ReferenceNumber": [
#           {
#             "Code": "01",
#             "Value": "LINE4AND115"
#           },
#           {
#             "Code": "08",
#             "Value": "LJ67Y5"
#           }
#         ]
#       }
#     },
#     "Disclaimer": "You are using UPS tracking service on customer integration test environment, please switch to UPS production environment once you finish the test. The URL is https://onlinetools.ups.com/webservices/Track"
#   }
# }

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

set statusCode [CkJsonObject_stringOf $json "TrackResponse.Response.ResponseStatus.Code"]
set statusDescription [CkJsonObject_stringOf $json "TrackResponse.Response.ResponseStatus.Description"]
puts "statusCode: $statusCode"
puts "statusDescription$statusDescription"
set customerContext [CkJsonObject_stringOf $json "TrackResponse.Response.TransactionReference.CustomerContext"]
set inquiryNumberCode [CkJsonObject_stringOf $json "TrackResponse.Shipment.InquiryNumber.Code"]
set inquiryNumberDescription [CkJsonObject_stringOf $json "TrackResponse.Shipment.InquiryNumber.Description"]
set inquiryNumberValue [CkJsonObject_stringOf $json "TrackResponse.Shipment.InquiryNumber.Value"]
set shipmentTypeCode [CkJsonObject_stringOf $json "TrackResponse.Shipment.ShipmentType.Code"]
set shipmentTypeDescription [CkJsonObject_stringOf $json "TrackResponse.Shipment.ShipmentType.Description"]
set shipperNumber [CkJsonObject_stringOf $json "TrackResponse.Shipment.ShipperNumber"]
set serviceCode [CkJsonObject_stringOf $json "TrackResponse.Shipment.Service.Code"]
set serviceDescription [CkJsonObject_stringOf $json "TrackResponse.Shipment.Service.Description"]
set referenceNumberCode [CkJsonObject_stringOf $json "TrackResponse.Shipment.ReferenceNumber.Code"]
set referenceNumberValue [CkJsonObject_stringOf $json "TrackResponse.Shipment.ReferenceNumber.Value"]
set pickupDate [CkJsonObject_stringOf $json "TrackResponse.Shipment.PickupDate"]
set trackingNumber [CkJsonObject_stringOf $json "TrackResponse.Shipment.Package.TrackingNumber"]
set unitOfMeasurementCode [CkJsonObject_stringOf $json "TrackResponse.Shipment.Package.PackageWeight.UnitOfMeasurement.Code"]
set weight [CkJsonObject_stringOf $json "TrackResponse.Shipment.Package.PackageWeight.Weight"]
set disclaimer [CkJsonObject_stringOf $json "TrackResponse.Disclaimer"]

set i 0
set activityCount [CkJsonObject_SizeOfArray $json "TrackResponse.Shipment.Package.Activity"]
puts "activityCount: $activityCount"

while {$i < $activityCount} {
    puts "-- activity $i"
    CkJsonObject_put_I $json $i
    if {[CkJsonObject_HasMember $json "TrackResponse.Shipment.Package.Activity[i].ActivityLocation.Address.City"] == 1} then {
        set city [CkJsonObject_stringOf $json "TrackResponse.Shipment.Package.Activity[i].ActivityLocation.Address.City"]
        puts "city: $city"
        set provinceCode [CkJsonObject_stringOf $json "TrackResponse.Shipment.Package.Activity[i].ActivityLocation.Address.StateProvinceCode"]
        set postalCode [CkJsonObject_stringOf $json "TrackResponse.Shipment.Package.Activity[i].ActivityLocation.Address.PostalCode"]
        set countryCode [CkJsonObject_stringOf $json "TrackResponse.Shipment.Package.Activity[i].ActivityLocation.Address.CountryCode"]
    }

    set locationCode [CkJsonObject_stringOf $json "TrackResponse.Shipment.Package.Activity[i].ActivityLocation.Code"]
    set locationDescription [CkJsonObject_stringOf $json "TrackResponse.Shipment.Package.Activity[i].ActivityLocation.Description"]
    set locationSignedForByName [CkJsonObject_stringOf $json "TrackResponse.Shipment.Package.Activity[i].ActivityLocation.SignedForByName"]

    set activityStatusType [CkJsonObject_stringOf $json "TrackResponse.Shipment.Package.Activity[i].Status.Type"]
    puts "activityStatusType: $activityStatusType"
    set activityStatusDescription [CkJsonObject_stringOf $json "TrackResponse.Shipment.Package.Activity[i].Status.Description"]
    puts "activityStatusDescription: $activityStatusDescription"
    set activityStatusCode [CkJsonObject_stringOf $json "TrackResponse.Shipment.Package.Activity[i].Status.Code"]
    puts "activityStatusCode: $activityStatusCode"

    set activityDate [CkJsonObject_stringOf $json "TrackResponse.Shipment.Package.Activity[i].Date"]
    set activityTime [CkJsonObject_stringOf $json "TrackResponse.Shipment.Package.Activity[i].Time"]

    if {[CkJsonObject_HasMember $json "TrackResponse.Shipment.Package.Activity[i].Document"] == 1} then {
        set typeCode [CkJsonObject_IntOf $json "TrackResponse.Shipment.Package.Activity[i].Document.Type.Code"]
        set typeDescription [CkJsonObject_stringOf $json "TrackResponse.Shipment.Package.Activity[i].Document.Type.Description"]
        set documentContent [CkJsonObject_stringOf $json "TrackResponse.Shipment.Package.Activity[i].Document.Content"]
        set documentFormatCode [CkJsonObject_stringOf $json "TrackResponse.Shipment.Package.Activity[i].Document.Format.Code"]
        # Format description would be something like "GIF" for a signature image.
        set documentFormatDescription [CkJsonObject_stringOf $json "TrackResponse.Shipment.Package.Activity[i].Document.Format.Description"]

        # 01 - Signature Image
        # 02 - Delivery Receipt
        # 03 - Free Astray
        # 04 - POD
        if {$typeCode == 1} then {
            # We have a signature image.  Get the image data and save to a file.
            set sbImagePath [new_CkStringBuilder]

            CkStringBuilder_Append $sbImagePath "qa_output/sig_"
            CkStringBuilder_Append $sbImagePath $trackingNumber
            CkStringBuilder_Append $sbImagePath "."
            CkStringBuilder_Append $sbImagePath $documentFormatDescription
            set imageData [new_CkBinData]

            set success [CkBinData_AppendEncoded $imageData $documentContent "base64"]
            # Write to "qa_output/sig_1Z12345E0205271688.GIF"
            set success [CkBinData_WriteFile $imageData [CkStringBuilder_getAsString $sbImagePath]]
        }

    }

    set i [expr $i + 1]
}

set i 0
set refnumCount [CkJsonObject_SizeOfArray $json "TrackResponse.Shipment.Package.ReferenceNumber"]
while {$i < $refnumCount} {
    CkJsonObject_put_I $json $i
    set refnumCode [CkJsonObject_stringOf $json "TrackResponse.Shipment.Package.ReferenceNumber[i].Code"]
    set refnumValue [CkJsonObject_stringOf $json "TrackResponse.Shipment.Package.ReferenceNumber[i].Value"]
    set i [expr $i + 1]
}

puts "Success."

delete_CkHttp $http
delete_CkJsonObject $json
delete_CkStringBuilder $sb
delete_CkHttpResponse $resp
delete_CkStringBuilder $sbImagePath
delete_CkBinData $imageData