J'essaie de télécharger un appel d'échange de données en masse vers eBay en utilisant leur API FileTransfer. Pour ce faire, je dois POSTER une chaîne de requête xml sur le serveur eBay mais la requête xml contient une section <Data>
qui doit inclure les données que vous transférez (dans ce cas, il s'agit d'un fichier zip encodé en base64 contenant un autre document XML). eBay donne un exemple en C# de la façon de construire un tel document: https://ebay.custhelp.com/app/answers/detail/a_id/1561Requête HTTP POST et en-têtes avec pièces jointes MIME multipart/related et xop?
J'ai essayé de recréer cet exemple en python en utilisant httplib pour POST une chaîne que j'ai construite de la même manière que l'exemple (le 3 UUID sont uniques):
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)
avec en-têtes qui ressemblent à ceci:
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\""
}
puis mon POST:
connection = httplib.HTTPSConnection('storage.sandbox.ebay.com')
connection.request("POST", '/FileTransferService', request, headers)
Lorsque je publie la requête XML sans les informations de pièce jointe MIME, elle accepte le fichier sans problème. Mais quand j'essaye de le faire comme le code ci-dessus, avec des pièces jointes MIME multipart/liées et la balise <xop>
indiquant où les données se trouvent dans la pièce jointe, le POST échoue et j'obtiens un "Erreur 302: déplacé temporairement" réponse. Cela me porte à croire que quelque chose ne va pas avec comment j'ai construit la requête MIME multipart/related xml, ou comment j'ai construit la déclaration d'en-tête "Content-type", ou mon utilisation de xop, ou probablement une combinaison des trois des choses.
Je suppose que ma question est: Comment puis-je créer une requête XML qui contient des sections MIME multipart/connexes et utilise également xop?
Merci pour l'aide!
Wes
J'essaie d'adopter moi-même cette réponse pour utiliser l'appel uploadFile. Je continue d'obtenir un "Veuillez spécifier un fichier avec un format valide". Je génère le XML dans la mémoire, puis gzipping et le mettre en base64 avec base64.standard_b64encode (gzip.compress (full_xml)) – Nelluk