1. はじめに
PythonのHTTPクライアントライブラリであるrequests
を利用して、json形式のデータを送受信するRest APIでファイルアップロードを行う方法について説明したいと思います。
ポイントはbase64エンコードしてバイナリデータをascii文字列として送信することです。
2. ソースコード
# -*- coding: utf-8 -*-
import requests
import base64
# ★ポイント1
XLSX_MIMETYPE = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
# main
if __name__ == "__main__":
# ★ポイント2
uploadData = {
'fileName': 'demo01.xlsx',
'contentType': XLSX_MIMETYPE,
# 'contentData': は別途設定
}
# ★ポイント3
fileDataBinary = open('demo01.xlsx', 'rb').read()
uploadData["contentData"] = base64.b64encode(fileDataBinary)
# ★ポイント4
url = 'http://localhost:3000/data/json/upload'
response = requests.post(url, json=uploadData)
print(response.status_code)
print(response.content)
★ポイント1
ファイルをアップロードする場合、ファイルフォーマットをサーバに知らせるため、MIMEタイプ(コンテントタイプ)を利用するのが一般的です。
最終的には利用するRest APIの仕様に準拠することになりますが、サンプルでもMIMEタイプを利用することにします。なお、xlsxのMIMEタイプは「2007 Office system ファイル形式の MIME タイプをサーバーで登録する」を参考にしました。
★ポイント2
Rest APIの入力データを定義します。今回はタイトルにもあるようにjson形式(Dict)としました。contentDataフィールドはこの後、個別に設定します。
- fileNameフィールド : アップロードファイルのファイル名
- contentTypeフィールド : アップロードファイルのMIMEタイプ
- contentDataフィールド : アップロードファイルのファイルデータ
★ポイント3
今回の記事の最大ポイントです。jsonではバイナリデータを設定できないため、base64でエンコードしたascii文字列を設定します。
base64エンコードはbase64.b64encode()
を利用することで簡単に変換できます。
★ポイント4
requests
を利用してRest APIを呼び出します。json形式でHTTPリクエストを送信する場合、json
パラメータを利用すると簡単です。
requests
の説明については以下の記事を参照ください。
3. さいごに
今回はrequests
でjson形式のRest APIでファイルアップロードを行う方法について説明しました。
この方法では、クライアント側ではファイルのバイナリデータをbase64でエンコードし、サーバ側では受信したデータをbase64でエンコードするオーバヘッド(余分な処理)が発生します。
ファイルのデータサイズが大きい場合はmultipart/form-data
によるFormを利用したファイルアップロードを検討した方がいいでしょう。
次回はrequests
を利用したmultipart/form-data
によるファイルアップロードについて説明したいと思います。