为什么HTTP POST请求体需JSON在Python的方式编码?(Why does HTTP PO

2019-08-18 04:39发布

与外部API玩耍时,我就遇到了这个问题。 我送我的身体数据字典直入请求,并渐渐400错误:

data = {
  "someParamRange": {
    "to": 1000, 
    "from": 100
  }, 
  "anotherParamRange": {
    "to": True, 
    "from": False
  }
}

当我添加了一个json.dumps包装,它的工作原理:

data = json.dumps({
  "someParamRange": {
    "to": 1000, 
    "from": 100
  }, 
  "anotherParamRange": {
    "to": True, 
    "from": False
  }
})

我不完全理解为什么这是必要的,因为字典和JSON对象在语法上是相同的。 有人可以帮助我明白是怎么回事就在这里幕后?

为了完整起见,这里有我的头:

headers = {'API-KEY': 'blerg', 'Accept-Encoding': 'UTF-8', 'Content-Type': 'application/json', 'Accept': '*/*', 'username': 'user', 'password': 'pwd'}

编辑:

我没有提到这一点早,但现在我觉得这可能是相关的。 我使用了Python库的请求,并另一篇文章似乎表明,你不应该以参数编码为请求对象: https://stackoverflow.com/a/14804320/1012040

“不管GET / POST是否你再也不用编码参数,它只是需要一个字典作为参数,并且是好去。”

似乎是序列化不应该是必要的?

我的请求对象:

response = requests.post(url, data=data, headers=headers)

Answer 1:

显然,你的API需要JSON编码,而不是形式的编码数据。 当通过一个dict中作为data参数,数据形式编码。 当传递一个字符串(等的结果json.dumps ),则数据不被形成编码。

考虑请求的文档这句话:

通常情况下,你要发送某种形式的编码数据 - 很像一个HTML表单。 要做到这一点,只需通过一本字典的数据参数。 数据的字典将自动成为请求时形式编码。

有迹象表明,要发送未形成编码数据多次。 如果你在一个字符串传递一个字典来代替,这些数据将直接公布。

例如,API的GitHub V3接受JSON编码POST / PATCH数据:

>>> import json
>>> url = 'https://api.github.com/some/endpoint'
>>> payload = {'some': 'data'}

>>> r = requests.post(url, data=json.dumps(payload))

参考文献:

  • http://www.w3.org/TR/html401/interact/forms.html#h-17.13.3.4
  • http://docs.python-requests.org/en/latest/user/quickstart/#more-complicated-post-requests


Answer 2:

尽管它们似乎syntatically itentical是有区别的:JSON是序列化的对象的字符串表示; 在这种情况下Python的字典。 在这个例子中,你需要在字符串的形式发送串行数据,从而json.dumps需要进行序列化。

编辑

作为评论的问题提出它是相对于所使用的API,但仍然系列化必须沿途某处做了通过网络发送的对象。



文章来源: Why does HTTP POST request body need to be JSON enconded in Python?