VBScript
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
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