我正在尝试使用 eBay 的 FileTransfer API 上传批量数据交换调用。
为了做到这一点,我必须将 xml 请求字符串发布到 eBay 服务器,但 xml
请求包含一个<Data>
必须包含您正在传输的数据的部分(在本例中,它是包含另一个 xml 文档的 base64 编码的 zip 文件)。 eBay 给出了一个 C# 示例来说明如何构建这样的文档:https://ebay.custhelp.com/app/answers/detail/a_id/1561 https://ebay.custhelp.com/app/answers/detail/a_id/1561
我一直在尝试使用 httplib 在 python 中重新创建这个示例,以 POST 我以与示例大致相同的方式构建的字符串(3 个 UUID 是唯一的):
request = """
--MIMEBoundaryurn_uuid_{XMLUUID}
Content-Type: application/xop+xml;charset=UTF-8;type="text/xml;charset=UTF-8";
Content-Transfer-Encoding: binary
Content-ID:<0.urn:uuid:{REQUUID}>
<?xml version="1.0" encoding="utf-8"?>
<uploadFileRequest xmlns:sct=\"http://www.ebay.com/soaframework/common/types\" xmlns="http://www.ebay.com/marketplace/services">
<fileAttachment>
<Size>{Size}</Size>
<Data><xop:Include xmlns:xop="http://www.w3.org/2004/08/xop/include"
href="cid:urn:uuid:{ATTCHMNTUUID}>"</Data>
</fileAttachment>
<fileFormat>{fileFormat}</fileFormat>
<fileReferenceId>{fileReferenceId}</fileReferenceId>
<taskReferenceId>{taskReferenceId}</taskReferenceId>
</uploadFileRequest>
--MIMEBoundaryurn_uuid_{XMLUUID}
Content-Type: application/octet-stream
Content-Transfer-Encoding: binary
Content-ID: <urn.uuid:{ATTCHMNTUUID}>\r\n
{Data}
--MIMEBoundaryurn_uuid_{XMLUUID}--
""".replace("\t", "")
request_dict = {
'Size': size,
'Data': payload,
'fileFormat': 'zip',
'fileReferenceId': '50000935383',
'taskReferenceId': '50000847753',
'REQUUID': reqUUID,
'XMLUUID': xmlUUID,
'ATTCHMNTUUID': attchmntUUID,
}
request = request.format( **request_dict )
标题看起来像这样:
headers = {
'X-EBAY-SOA-OPERATION-NAME': 'uploadFile',
'X-EBAY-SOA-SERVICE-NAME': 'FileTransferService',
'X-EBAY-SOA-SECURITY-TOKEN': #Auth Token,
'Content-type': "multipart/related; boundary=" + boundary + ";type=\"application/xop+xml\";start=\"<0." + "urn:uuid:" + str(requuid) + ">\";start-info=\"text/xml\""
}
然后是我的帖子:
connection = httplib.HTTPSConnection( 'storage.sandbox.ebay.com' )
connection.request( "POST", '/FileTransferService', request, headers )
当我发布不带 MIME 附件信息的 xml 请求时,它会毫无问题地接受该文件。但是当我尝试像上面的代码那样使用 MIME 多部分/相关附件和<xop>
标签指出数据在附件中的位置,POST 不成功,我收到“错误 302:暂时移动”响应。这让我相信我构建 MIME 多部分/相关 xml 请求的方式,或者我构建“Content-type”标头声明的方式,或者我对 xop 的使用,或者很可能是所有三者的组合,有些东西是不正确的事物。
我想我的问题是:如何创建包含 MIME 多部分/相关部分并且还使用 xop 的 xml 请求?
谢谢您的帮助!
Wes