Sample code for 30+ languages & platforms
VBScript

Xero Get Attachment (Download a Xero Attachment)

Demonstrates how to get the content of an attachment in Xero.

Note: This example requires Chilkat v9.5.0.64 or greater.

Chilkat VBScript Downloads

VBScript
Dim fso, outFile
Set fso = CreateObject("Scripting.FileSystemObject")
'Create a Unicode (utf-16) output text file.
Set outFile = fso.CreateTextFile("output.txt", True, True)

success = 0

' Note: Requires Chilkat v9.5.0.64 or greater.

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

set rest = CreateObject("Chilkat.Rest")

' Before sending REST API calls, the REST object needs to be
' initialized for OAuth1.
' See Xero 2-Legged OAuth1 Setup for sample code.

' Assuming the REST object's OAuth1 authenticator is setup, and the initial
' connection was made, we may now send REST HTTP requests..

' --------------------------------------------------------------
' First get a list of attachments for a given document (in this case a Receipt).

endPoint = "Receipts"
receiptID = "c4f40e59-c390-0001-caff-ce731c707d00"

set sbPath = CreateObject("Chilkat.StringBuilder")
success = sbPath.Append("/api.xro/2.0/{Endpoint}/{Guid}/Attachments/")
numReplaced = sbPath.Replace("{Endpoint}",endPoint)
numReplaced = sbPath.Replace("{Guid}",receiptID)

responseXml = rest.FullRequestNoBody("GET",sbPath.GetAsString())
If (rest.LastMethodSuccess <> 1) Then
    outFile.WriteLine(rest.LastErrorText)
    WScript.Quit
End If

' A 200 response is expected for actual success.
If (rest.ResponseStatusCode <> 200) Then
    outFile.WriteLine(responseXml)
    WScript.Quit
End If

' Examine the response.
outFile.WriteLine(responseXml)

' A sample response looks like this:

' 	<Response xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
' 	  <Id>b235646f-34ac-4b15-90ce-d63267f7cd33</Id>
' 	  <Status>OK</Status>
' 	  <ProviderName>ChilkatPrivate</ProviderName>
' 	  <DateTimeUTC>2016-11-11T14:32:17.0908971Z</DateTimeUTC>
' 	  <Attachments>
' 	    <Attachment>
' 	      <AttachmentID>0edcddc8-325f-40c7-b950-8c71f14afc7c</AttachmentID>
' 	      <FileName>penguins.jpg</FileName>
' 	      <Url>http://api.xero.com/api.xro/2.0/Receipts/c4f40e59-c390-0001-caff-ce731c707d00/Attachments/penguins.jpg</Url>
' 	      <MimeType>image/jpg</MimeType>
' 	      <ContentLength>777835</ContentLength>
' 	    </Attachment>
' 	    <Attachment>
' 	      <AttachmentID>0adffdc8-325f-65c7-b950-4391f14af908</AttachmentID>
' 	      <FileName>starfish.jpg</FileName>
' 	      <Url>http://api.xero.com/api.xro/2.0/Receipts/c4f40e59-c390-0001-caff-ce731c707d00/Attachments/starfish.jpg</Url>
' 	      <MimeType>image/jpg</MimeType>
' 	      <ContentLength>24537</ContentLength>
' 	    </Attachment>
' 	  </Attachments>
' 	</Response>

set xml = CreateObject("Chilkat.Xml")
success = xml.LoadXml(responseXml)

' Iterate over the attachments and download each.
numRecords = xml.NumChildrenAt("Attachments")
outFile.WriteLine("Number of Attachments = " & numRecords)

set sbSaveFilePath = CreateObject("Chilkat.StringBuilder")
set sbAttachmentPath = CreateObject("Chilkat.StringBuilder")
set attachmentData = CreateObject("Chilkat.BinData")
i = 0
Do While i < numRecords
    xml.I = i
    attachmentID = xml.GetChildContent("Attachments|Attachment[i]|AttachmentID")
    filename = xml.GetChildContent("Attachments|Attachment[i]|FileName")

    outFile.WriteLine("AttachmentID: " & attachmentID)
    outFile.WriteLine("Filename: " & filename)
    outFile.WriteLine("----")

    ' Download this attachment.
    ' First build the path for this particular attachment by appending the FileName to the path used to get the list of attachments.
    sbAttachmentPath.Clear 
    success = sbAttachmentPath.AppendSb(sbPath)
    success = sbAttachmentPath.Append(filename)

    ' Send the GET request in one call, and then get the response in the next two.
    success = rest.SendReqNoBody("GET",sbAttachmentPath.GetAsString())
    If (success <> 1) Then
        outFile.WriteLine(rest.LastErrorText)
        WScript.Quit
    End If

    ' Get the response header.  If it's not a 200 success status code, then the response body does NOT contain
    ' the attachment data.
    statusCode = rest.ReadResponseHeader()
    If (statusCode = -1) Then
        ' We didn't get any response..
        outFile.WriteLine(rest.LastErrorText)
        WScript.Quit
    End If

    If (statusCode <> 200) Then
        outFile.WriteLine("Response Status: " & statusCode)
        responseBody = rest.ReadRespBodyString()
        If (rest.LastMethodSuccess <> 1) Then
            outFile.WriteLine("Failed to read the response body.")
        Else
            outFile.WriteLine(responseBody)
        End If

        outFile.WriteLine("Failed.")
        WScript.Quit
    End If

    ' OK, the response header indicates the attachment content is forthcoming...
    ' There are a few ways to get the response body. If it is a very large attachment, it can be streamed directly
    ' to a file.  We'll assume it's not, so we'll get the response into a BinData object, and then save it to a file.
    success = attachmentData.Clear()
    success = rest.ReadRespBd(attachmentData)
    If (success <> 1) Then
        outFile.WriteLine(rest.LastErrorText)
        WScript.Quit
    End If

    ' Save the data to the file.
    success = sbSaveFilePath.SetString("qa_output/")
    success = sbSaveFilePath.Append(filename)
    success = attachmentData.WriteFile(sbSaveFilePath.GetAsString())
    If (success <> 1) Then
        outFile.WriteLine("Failed to save to output file.")
    Else
        outFile.WriteLine("Saved to " & sbSaveFilePath.GetAsString())
    End If

    i = i + 1
Loop

outFile.Close