12A猫で学んだこと-Memoir-

...What are you learning now?

requests でシリアライズ化されたJSONを送信する時のポカミス

テーマ

requests モジュールでPOSTリクエストを送る時の json / data パラメータの違い

まとめ

  • json 文字列をPOSTリクエストとして送信したいとき
    • json パラメータにシリアライズ可能なオブジェクトを渡す
    • dataJSON文字列を渡すときには、ヘッダのContent-Type```をapplication/json`` を設定する

関連情報

  • requests.models.PreparedRequest.prepared_body が処理内容
    • ドキュメントに記載されている通りの処理

お茶目な失敗例

JSONシリアライズ化したオブジェクトを送りたいと思いつつ、 下記のようなことをやってしまっていたのが、今回調べた理由...

import json
import requests

target = {"key": "value"}

# dataに辞書型を渡したときにに、JSONではなく、``form-encoded`` となる
requests.post("http://localhost", data=target)

# 文字列として送信されてしまう
requests.post("http://localhost", json=json.dumps(target))

可愛い失敗でした。 てへぺろ