我正嘗試使用他們的FileTransfer API將批量數據交換呼叫上傳到eBay。 爲了做到這一點,我必須將一個xml請求字符串發佈到eBay服務器,但xml 請求包含一個<Data>
部分,該部分必須包含要傳輸的數據(在這種情況下,它是包含另一個數據的base64編碼zip文件xml文檔)。 eBay在C#中給出了一個如何構建這樣一個文檔的例子:https://ebay.custhelp.com/app/answers/detail/a_id/1561HTTP POST請求和MIME附件multipart/headers和xop的頭?
我一直試圖在python中使用httplib重新創建這個例子來發佈一個字符串我已經以與例子大致相同的方式構建了一個字符串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未成功,我得到一個「Error 302:Moved Temporarily」響應。這使我相信某些事情與我如何構建MIME multipart/related xml請求,或者我如何構建「Content-type」頭聲明,或者我使用xop,或者很可能是所有三種的東西。
我想我的問題是:如何創建一個包含MIME multipart /相關部分的xml請求,並且還使用xop?
感謝您的幫助!
Wes
我想通過這個答案自己使用uploadFile調用。我不斷收到「請指定具有有效格式的文件」。我在內存中生成XML,然後使用base64.standard_b64encode(gzip.compress(full_xml))將其壓縮到base64中 – Nelluk