Sample code for 30+ languages & platforms
PureBasic

Xero Upload Attachment

See more Xero Examples

Demonstrates how to upload an attachment to Xero.

Chilkat PureBasic Downloads

PureBasic
IncludeFile "CkBinData.pb"
IncludeFile "CkHttp.pb"
IncludeFile "CkJsonObject.pb"
IncludeFile "CkHttpResponse.pb"

Procedure ChilkatExample()

    success.i = 0

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

    http.i = CkHttp::ckCreate()
    If http.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    ; Important: Make sure your OAuth2 access token was obtained with the scope "accounting.attachments"
    ; included in the list of scopes.

    jsonToken.i = CkJsonObject::ckCreate()
    If jsonToken.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    success = CkJsonObject::ckLoadFile(jsonToken,"qa_data/tokens/xero-access-token.json")
    If success = 0
        Debug CkJsonObject::ckLastErrorText(jsonToken)
        CkHttp::ckDispose(http)
        CkJsonObject::ckDispose(jsonToken)
        ProcedureReturn
    EndIf

    CkHttp::setCkAuthToken(http, CkJsonObject::ckStringOf(jsonToken,"access_token"))

    ; Replace the value here with an actual tenant ID obtained from this example:
    ; Get Xero Tenant IDs
    CkHttp::ckSetRequestHeader(http,"Xero-tenant-id","83299b9e-5747-4a14-a18a-a6c94f824eb7")

    CkHttp::setCkAccept(http, "application/json")

    url.s = "https://api.xero.com/api.xro/2.0/{$Endpoint}/{$Guid}/Attachments/{$Filename}"

    ; Endpoint can be Invoices, Receipts, CreditNotes, PurchaseOrders, etc.
    CkHttp::ckSetUrlVar(http,"Endpoint","Invoices")

    ; Guid is the ID of the item, such as the InvoiceID.
    CkHttp::ckSetUrlVar(http,"Guid","0032f627-3156-4d30-9b1c-4d3b994dc921")

    ; Filename is the filename of the attachment you are uploading.
    CkHttp::ckSetUrlVar(http,"Filename","penguins.jpg")

    ; Load the file to be uploaded (from the local filesystem).
    bd.i = CkBinData::ckCreate()
    If bd.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    success = CkBinData::ckLoadFile(bd,"qa_data/jpg/penguins.jpg")
    If success = 0
        Debug "Failed to load attachment file."
        CkHttp::ckDispose(http)
        CkJsonObject::ckDispose(jsonToken)
        CkBinData::ckDispose(bd)
        ProcedureReturn
    EndIf

    ; Indicate the content-type according to the file content type.
    ; Common content-types are:   image/jpg, image/png, application/pdf, application/zip, application/msword
    ; If you don't know, use application/octet-stream
    resp.i = CkHttpResponse::ckCreate()
    If resp.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    success = CkHttp::ckHttpBd(http,"POST",url,bd,"image/jpg",resp)
    If success = 0
        Debug CkHttp::ckLastErrorText(http)
        CkHttp::ckDispose(http)
        CkJsonObject::ckDispose(jsonToken)
        CkBinData::ckDispose(bd)
        CkHttpResponse::ckDispose(resp)
        ProcedureReturn
    EndIf

    Debug "Response Status Code: " + Str(CkHttpResponse::ckStatusCode(resp))

    jsonResponse.i = CkJsonObject::ckCreate()
    If jsonResponse.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    CkJsonObject::ckLoad(jsonResponse,CkHttpResponse::ckBodyStr(resp))
    CkJsonObject::setCkEmitCompact(jsonResponse, 0)
    Debug CkJsonObject::ckEmit(jsonResponse)

    If CkHttpResponse::ckStatusCode(resp) <> 200
        Debug "Failed."
        CkHttp::ckDispose(http)
        CkJsonObject::ckDispose(jsonToken)
        CkBinData::ckDispose(bd)
        CkHttpResponse::ckDispose(resp)
        CkJsonObject::ckDispose(jsonResponse)
        ProcedureReturn
    EndIf

    ; A sample response:

    ; Use this online tool to generate parsing code from sample JSON: 
    ; Generate Parsing Code from JSON

    ; {
    ;   "Id": "35333c64-4449-457b-bf6a-1b64d538e3c7",
    ;   "Status": "OK",
    ;   "ProviderName": "Chilkat2222",
    ;   "DateTimeUTC": "\/Date(1587212597758)\/",
    ;   "Attachments": [
    ;     {
    ;       "AttachmentID": "daf106e2-8634-4349-bfcc-86c1df0793b2",
    ;       "FileName": "penguins.jpg",
    ;       "Url": "https://api.xero.com/api.xro/2.0/Invoices/0032f627-3156-4d30-9b1c-4d3b994dc921/Attachments/penguins.jpg",
    ;       "MimeType": "image/jpg",
    ;       "ContentLength": 777835
    ;     }
    ;   ]
    ; }


    CkHttp::ckDispose(http)
    CkJsonObject::ckDispose(jsonToken)
    CkBinData::ckDispose(bd)
    CkHttpResponse::ckDispose(resp)
    CkJsonObject::ckDispose(jsonResponse)


    ProcedureReturn
EndProcedure