【问题标题】:Why can't I send `None` as data in a POST request using Python's `requests` library?为什么我不能使用 Python 的 `requests` 库在 POST 请求中发送 `None` 作为数据?
【发布时间】:2016-07-16 06:21:03
【问题描述】:

似乎当data 中的键的值为None 时,请求中不包含该键。

>>> req = requests.Request('POST', 'http://google.com', data=dict(a=None, b=1))
>>> req.prepare().body
'b=1'

为什么会这样?我期待一个空字符串,或类似json.dumps(d) 的东西,其中None 呈现为null。我敢肯定有一个很好的理由——只是好奇它是什么。 (我能想到的一件事是,也许只是没有可用于 POST 请求的 nullNone 的编码——这是真的吗?)

另外好奇——为什么requests 会默默地忽略这些数据而不是抛出错误?

【问题讨论】:

  • None 是一个特殊的类 (python3.x) / 类型 (python2.x),旨在表示没有值。如果您想要一个空字符串,请将 a 设为空字符串 (a="")。更多信息here

标签: python http-post python-requests


【解决方案1】:

将字典元素设置为None 是您明确表示您不希望将该参数发送到服务器的方式。

我在requests.Request() 文档中找不到特别提到的这一点,但在Passing Parameters in URLs 中它说:

请注意,任何值为 None 的字典键都不会添加到 URL 的查询字符串中。

显然它对POST 请求也使用了一致的逻辑。

如果要发送空字符串,请将字典元素设置为空字符串,而不是 None

【讨论】:

  • 感谢您的回复!我现在想知道的是为什么requests 提供了这种忽略参数的工具。如果我不想发送它,我不能不将它包含在字典中吗?
  • @EliRose 这是提供的,因为您可能在不希望发送的会话上设置了默认值。由于您使用的流程忽略了这一点,您始终可以手动将正文更新为您所期望的。
  • @sigmavirus24:很有趣——你能不能给我指出一个你正在谈论的用例的例子?回复:您提到的替代方案;在现实生活中我只是使用request.post(...)req.prepare().body 仅用于说明目的。
  • @EliRose 他们可能都使用一个通用的例程来处理数据字典,而None 是用于删除参数的占位符。
【解决方案2】:

我遇到了类似的空白值问题,这是我的解决方法。我将数据作为 json 字符串发送,并将内容类型标头设置为 application/json。这似乎按预期发送了整个数据。花了相当长的时间才弄清楚。希望这对某人有所帮助。

import requests
import json

header = {"Content-Type":"application/json"}

data = {
    "xxx": None,
    "yyy": "http://",
    "zzz": 12345
    }

res = requests.post('https://httpbin.org/post', 
                    data=json.dumps(data), headers=header)

obj = json.loads(res.text)

print obj['json']

【讨论】:

    【解决方案3】:

    几天前我也有同样的问题,如果你用 json 替换数据,它应该对你有用,因为现在None 将在正文中发送。

    request('POST', 'http://google.com', json=dict(a=None, b=1))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-24
      • 2017-12-25
      • 2021-03-14
      • 1970-01-01
      相关资源
      最近更新 更多