web-dev-qa-db-ja.com

Python requests.post multipart / form-data

REST APIを使用してファイルと情報をサーバーにアップロードする必要があります。そのAPIはマルチパートフォームを使用していますが、正しく使用できないようです。

これは、APIドキュメントに従って使用する情報です。

フォームパラメータ:

  • description –ディストリビューションの短い説明。
  • release_notes_url –リリースノートを指すURL。
  • Zip_file –配布ファイルを含むZipファイル。

リクエストの例:

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--

たとえば次のコードのように、いくつかのことを試しましたが、サーバーからの不正なリクエストエラーが何度も発生します。

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

ドキュメントには例があります http://requests.readthedocs.org/en/latest/user/quickstart/#post-a-multipart-encoded-file

単純なユースケースの場合は、ここから始めてください。

この回答では、ファイルとデータの併用についても説明しています。

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

以下は、カットアンドペーストのコードが必要な人のための実用的な例です。 httpbinは、実行したリクエストを記述したjsonデータ構造を返します。この場合、filesには投稿されたファイルデータが含まれ、formにはフォームvarsが含まれていることがわかります。 headersは、本当にmultipart/form-data リクエスト。

>>> 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'}

お楽しみ

9
Josh J