web-dev-qa-db-fra.com

Python requests.post multipart / form-data

Je dois utiliser une API REST pour télécharger des fichiers et des informations sur un serveur. Cette API utilise un formulaire en plusieurs parties, mais je n'arrive pas à l'utiliser correctement.

Voici les informations que j'utilise selon la documentation de l'API.

Paramètres du formulaire:

  • description - Une brève description de la distribution.
  • release_notes_url - Une URL pointant vers les notes de publication.
  • Zip_file - Le fichier Zip contenant les fichiers de distribution.

Exemple de demande:

POST /api/v1/distribution HTTP/1.1
Host: api.company.onbe
Authorization: t=...
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryZayrf7leHxinyQsX


------WebKitFormBoundaryZayrf7leHxinyQsX
Content-Disposition: form-data; name="release_notes_url"
http://releases/3.0.0/release_notes_3_0_0.pdf
------WebKitFormBoundaryZayrf7leHxinyQsX
Content-Disposition: form-data; name="description"
This is the new distribution!
------WebKitFormBoundaryZayrf7leHxinyQsX
Content-Disposition: form-data; name="Zip_file"; filename="BackEnd-3.0.0.Zip"
Content-Type: application/x-Zip-compressed
------WebKitFormBoundaryZayrf7leHxinyQsX--

J'ai essayé plusieurs choses, comme le code suivant par exemple, mais je reçois toujours de mauvaises erreurs de demande du serveur.

import requests

file= open('BackEnd-3.0.0.Zip','r').read()

url = 'api.company.onbe/api/v1/distribution'

payload = {
  'description' :'Some desc',
  'release_notes_url':'Someurl.pdf',
  'Zip_file': file
  }

response = requests.post(url, data=payload)
6
Amaranth

Les documents ont un exemple http://requests.readthedocs.org/en/latest/user/quickstart/#post-a-multipart-encoded-file

Vous devriez vraiment commencer par là pour des cas d'utilisation simples.

Cette réponse explique également l'utilisation conjointe de fichiers et de données.

https://stackoverflow.com/a/12385661/1182891

Voici un exemple de travail pour les personnes qui veulent du code couper-coller. httpbin renvoie une structure de données json décrivant la demande que vous avez faite de le faire. Dans ce cas, vous pouvez voir que files contient les données de fichier publiées et form contient les variables de formulaire. headers montre qu'il s'agissait bien d'un multipart/form-data demande.

>>> import requests
>>> from pprint import pprint
>>> url = 'http://httpbin.org/post'
>>> files = {'file': ('report.csv', 'some,data,to,send\nanother,row,to,send\n')}
>>> response = requests.post(url, data={
...   'description' :'Some desc',
...   'release_notes_url':'Someurl.pdf'
...   }, files=files)
>>> pprint(response.json())
{u'args': {},
 u'data': u'',
 u'files': {u'file': u'some,data,to,send\nanother,row,to,send\n'},
 u'form': {u'description': u'Some desc', u'release_notes_url': u'Someurl.pdf'},
 u'headers': {u'Accept': u'*/*',
              u'Accept-Encoding': u'gzip, deflate',
              u'Content-Length': u'394',
              u'Content-Type': u'multipart/form-data; boundary=ebf9f03029db4c2799ae16b5428b06bd',
              u'Host': u'httpbin.org',
              u'User-Agent': u'python-requests/2.10.0'},
 u'json': None,
 u'Origin': u'73.0.41.38',
 u'url': u'http://httpbin.org/post'}

Profitez-en !

9
Josh J