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:
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)
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 !