Sample code for 30+ languages & platforms
Xbase++

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 Xbase++ Downloads

Xbase++
LOCAL nSuccess
LOCAL oHttp
LOCAL cUrl
LOCAL oJson
LOCAL oSb
LOCAL oResp
LOCAL cStatusCode
LOCAL cStatusDescription
LOCAL cCustomerContext
LOCAL cInquiryNumberCode
LOCAL cInquiryNumberDescription
LOCAL cInquiryNumberValue
LOCAL cShipmentTypeCode
LOCAL cShipmentTypeDescription
LOCAL cShipperNumber
LOCAL cServiceCode
LOCAL cServiceDescription
LOCAL cReferenceNumberCode
LOCAL cReferenceNumberValue
LOCAL cPickupDate
LOCAL cTrackingNumber
LOCAL cUnitOfMeasurementCode
LOCAL cWeight
LOCAL cDisclaimer
LOCAL i
LOCAL nActivityCount
LOCAL cCity
LOCAL cProvinceCode
LOCAL cPostalCode
LOCAL cCountryCode
LOCAL cLocationCode
LOCAL cLocationDescription
LOCAL cLocationSignedForByName
LOCAL cActivityStatusType
LOCAL cActivityStatusDescription
LOCAL cActivityStatusCode
LOCAL cActivityDate
LOCAL cActivityTime
LOCAL nTypeCode
LOCAL cTypeDescription
LOCAL cDocumentContent
LOCAL cDocumentFormatCode
LOCAL cDocumentFormatDescription
LOCAL oSbImagePath
LOCAL oImageData
LOCAL nRefnumCount
LOCAL cRefnumCode
LOCAL cRefnumValue

nSuccess := 0

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

oHttp := CreateObject("Chilkat.Http")

//  This is the testing endpoint for the tracking API:
cUrl := "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.
oJson := CreateObject("Chilkat.JsonObject")
oJson:UpdateString("UPSSecurity.UsernameToken.Username", "UPS_USERNAME")
oJson:UpdateString("UPSSecurity.UsernameToken.Password", "UPS_PASSWORD")
oJson:UpdateString("UPSSecurity.ServiceAccessToken.AccessLicenseNumber", "UPS_ACCESS_KEY")
//  Request all activity...
oJson:UpdateString("TrackRequest.Request.RequestOption", "activity")
oJson:UpdateString("TrackRequest.Request.TransactionReference.CustomerContext", "Your Test Case Summary Description")
oJson:UpdateString("TrackRequest.InquiryNumber", "1Z12345E0205271688")

oSb := CreateObject("Chilkat.StringBuilder")
oResp := CreateObject("Chilkat.HttpResponse")
nSuccess := oHttp:HttpJson("POST", cUrl, oJson, "application/json", oResp)
IF (nSuccess == 0)
    ? oHttp:LastErrorText
    oHttp:destroy()
    oJson:destroy()
    oSb:destroy()
    oResp:destroy()
    RETURN
ENDIF

? "status = " + Str(oResp:StatusCode)

//  A 200 response status indicate success.
IF (oResp:StatusCode != 200)
    ? oResp:BodyStr
    ? "Failed."
    oHttp:destroy()
    oJson:destroy()
    oSb:destroy()
    oResp:destroy()
    RETURN
ENDIF

oJson:Load(oResp:BodyStr)
oJson:EmitCompact := 0
? oJson:Emit()

//  {
//    "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.

cStatusCode := oJson:StringOf("TrackResponse.Response.ResponseStatus.Code")
cStatusDescription := oJson:StringOf("TrackResponse.Response.ResponseStatus.Description")
? "statusCode: " + cStatusCode
? "statusDescription" + cStatusDescription
cCustomerContext := oJson:StringOf("TrackResponse.Response.TransactionReference.CustomerContext")
cInquiryNumberCode := oJson:StringOf("TrackResponse.Shipment.InquiryNumber.Code")
cInquiryNumberDescription := oJson:StringOf("TrackResponse.Shipment.InquiryNumber.Description")
cInquiryNumberValue := oJson:StringOf("TrackResponse.Shipment.InquiryNumber.Value")
cShipmentTypeCode := oJson:StringOf("TrackResponse.Shipment.ShipmentType.Code")
cShipmentTypeDescription := oJson:StringOf("TrackResponse.Shipment.ShipmentType.Description")
cShipperNumber := oJson:StringOf("TrackResponse.Shipment.ShipperNumber")
cServiceCode := oJson:StringOf("TrackResponse.Shipment.Service.Code")
cServiceDescription := oJson:StringOf("TrackResponse.Shipment.Service.Description")
cReferenceNumberCode := oJson:StringOf("TrackResponse.Shipment.ReferenceNumber.Code")
cReferenceNumberValue := oJson:StringOf("TrackResponse.Shipment.ReferenceNumber.Value")
cPickupDate := oJson:StringOf("TrackResponse.Shipment.PickupDate")
cTrackingNumber := oJson:StringOf("TrackResponse.Shipment.Package.TrackingNumber")
cUnitOfMeasurementCode := oJson:StringOf("TrackResponse.Shipment.Package.PackageWeight.UnitOfMeasurement.Code")
cWeight := oJson:StringOf("TrackResponse.Shipment.Package.PackageWeight.Weight")
cDisclaimer := oJson:StringOf("TrackResponse.Disclaimer")

i := 0
nActivityCount := oJson:SizeOfArray("TrackResponse.Shipment.Package.Activity")
? "activityCount: " + Str(nActivityCount)

DO WHILE i < nActivityCount
    ? "-- activity " + Str(i)
    oJson:I := i
    IF (oJson:HasMember("TrackResponse.Shipment.Package.Activity[i].ActivityLocation.Address.City") == 1)
        cCity := oJson:StringOf("TrackResponse.Shipment.Package.Activity[i].ActivityLocation.Address.City")
        ? "city: " + cCity
        cProvinceCode := oJson:StringOf("TrackResponse.Shipment.Package.Activity[i].ActivityLocation.Address.StateProvinceCode")
        cPostalCode := oJson:StringOf("TrackResponse.Shipment.Package.Activity[i].ActivityLocation.Address.PostalCode")
        cCountryCode := oJson:StringOf("TrackResponse.Shipment.Package.Activity[i].ActivityLocation.Address.CountryCode")
    ENDIF

    cLocationCode := oJson:StringOf("TrackResponse.Shipment.Package.Activity[i].ActivityLocation.Code")
    cLocationDescription := oJson:StringOf("TrackResponse.Shipment.Package.Activity[i].ActivityLocation.Description")
    cLocationSignedForByName := oJson:StringOf("TrackResponse.Shipment.Package.Activity[i].ActivityLocation.SignedForByName")

    cActivityStatusType := oJson:StringOf("TrackResponse.Shipment.Package.Activity[i].Status.Type")
    ? "activityStatusType: " + cActivityStatusType
    cActivityStatusDescription := oJson:StringOf("TrackResponse.Shipment.Package.Activity[i].Status.Description")
    ? "activityStatusDescription: " + cActivityStatusDescription
    cActivityStatusCode := oJson:StringOf("TrackResponse.Shipment.Package.Activity[i].Status.Code")
    ? "activityStatusCode: " + cActivityStatusCode

    cActivityDate := oJson:StringOf("TrackResponse.Shipment.Package.Activity[i].Date")
    cActivityTime := oJson:StringOf("TrackResponse.Shipment.Package.Activity[i].Time")

    IF (oJson:HasMember("TrackResponse.Shipment.Package.Activity[i].Document") == 1)
        nTypeCode := oJson:IntOf("TrackResponse.Shipment.Package.Activity[i].Document.Type.Code")
        cTypeDescription := oJson:StringOf("TrackResponse.Shipment.Package.Activity[i].Document.Type.Description")
        cDocumentContent := oJson:StringOf("TrackResponse.Shipment.Package.Activity[i].Document.Content")
        cDocumentFormatCode := oJson:StringOf("TrackResponse.Shipment.Package.Activity[i].Document.Format.Code")
        //  Format description would be something like "GIF" for a signature image.
        cDocumentFormatDescription := oJson:StringOf("TrackResponse.Shipment.Package.Activity[i].Document.Format.Description")

        //  01 - Signature Image
        //  02 - Delivery Receipt
        //  03 - Free Astray
        //  04 - POD
        IF (nTypeCode == 1)
            //  We have a signature image.  Get the image data and save to a file.
            oSbImagePath := CreateObject("Chilkat.StringBuilder")
            oSbImagePath:Append("qa_output/sig_")
            oSbImagePath:Append(cTrackingNumber)
            oSbImagePath:Append(".")
            oSbImagePath:Append(cDocumentFormatDescription)
            oImageData := CreateObject("Chilkat.BinData")
            nSuccess := oImageData:AppendEncoded(cDocumentContent, "base64")
            //  Write to "qa_output/sig_1Z12345E0205271688.GIF"
            nSuccess := oImageData:WriteFile(oSbImagePath:GetAsString())
        ENDIF

    ENDIF

    i := i + 1
ENDDO

i := 0
nRefnumCount := oJson:SizeOfArray("TrackResponse.Shipment.Package.ReferenceNumber")
DO WHILE i < nRefnumCount
    oJson:I := i
    cRefnumCode := oJson:StringOf("TrackResponse.Shipment.Package.ReferenceNumber[i].Code")
    cRefnumValue := oJson:StringOf("TrackResponse.Shipment.Package.ReferenceNumber[i].Value")
    i := i + 1
ENDDO

? "Success."

oHttp:destroy()
oJson:destroy()
oSb:destroy()
oResp:destroy()
oSbImagePath:destroy()
oImageData:destroy()