使用Xero API上传文件至现有发票时遇请求处理错误排查求助
Xero API发票附件上传VBA代码排查
问题描述
尝试通过Xero API将文件上传至现有发票始终失败,认证环节无异常(可正常通过API获取文件)。以下是测试用VBA代码及返回错误信息,需排查问题根源是代码还是Xero API本身。
测试代码
Dim URL As String Dim http As Object Dim invfilepath As String Dim bdy As String Set http = CreateObject("MSXML2.XMLHTTP") guidtarget = "995f6b3e-085b-4ec7-82e5-f8b78235f8e3" '目标发票GUID URL = "https://api.xero.com/api.xro/2.0/Invoices/" & guidtarget & "/Attachments/test.txt" bdy = "This is a test" toke = Trim(DLookup("[Access_token]", "Xero_Tokens")) '获取当前token tid = get_registry("Tenant_ID", "") '获取租户ID http.Open "POST", URL, False http.setRequestHeader "Authorization: ", "Bearer " & toke http.setRequestHeader "xero-tenant-id: ", tid http.setRequestHeader "Content Type:", "text/plain" http.Send bdy responsedata = http.responseText Me!resp = responsedata
返回错误信息
An error occurred while processing your request.
Reference #253.95b92917.1711691972.45a51cbe
https://errors.edgesuite.net/253.95b92917.1711691972.45a51cbe
排查分析与修正方案
1. 请求头格式错误(核心问题)
setRequestHeader的第一个参数不能带末尾冒号,且Content Type的标准HTTP头名称是Content-Type(连字符而非空格)。错误的头格式会导致服务器无法解析请求,直接返回通用错误。
修正后的请求头代码:
http.setRequestHeader "Authorization", "Bearer " & toke http.setRequestHeader "xero-tenant-id", tid http.setRequestHeader "Content-Type", "text/plain"
2. API端点与文件名处理
Xero官方文档中,发票附件上传的标准端点为https://api.xero.com/api.xro/2.0/Invoices/{InvoiceID}/Attachments,文件名通常通过请求头Xero-FileName指定,而非直接拼在URL中。建议调整端点并添加文件名头:
URL = "https://api.xero.com/api.xro/2.0/Invoices/" & guidtarget & "/Attachments" http.setRequestHeader "Xero-FileName", "test.txt"
3. 请求内容格式验证
部分场景下Xero API要求用multipart/form-data格式上传附件,若修正头信息后仍失败,可尝试改用表单格式发送内容(需构造multipart请求体)。
后续排查步骤
- 用Postman等工具模拟符合规范的请求,验证API端点、token、租户ID的有效性。
- 登录Xero开发者平台查看详细错误日志,获取比边缘节点通用错误更具体的信息。
- 对照Xero API官方文档(发票附件上传章节),确认所有请求参数、头信息符合要求。
内容的提问来源于stack exchange,提问作者Stacky
相关产品推荐
相关产品推荐

