【问题标题】:Difference between data and json parameters in python requests packagepython请求包中data和json参数的区别
【发布时间】:2014-12-28 09:32:53
【问题描述】:

python Requests包中的data和json参数有什么区别?

不清楚来自the documentation

这个代码:

import requests
import json
d = {'a': 1}
response = requests.post(url, data=json.dumps(d))

请注意,我们在这里将dict 转换为 JSON ☝️!

做任何不同的事情:

import requests
import json
d = {'a': 1}
response = requests.post(url, json=d)

如果是这样,那是什么?后者是否自动将标头中的content-type 设置为application/json

【问题讨论】:

    标签: python json python-requests


    【解决方案1】:

    截至2021我觉得requestsdocumentation is more clear差不多有区别,但我还是创建了a PR to make it more clear


    PS 这不能回答 OP 问题,但如果 FIRST 代码会有点不同:

    import requests
    import json
    d = {'a': 1}
    response = requests.post(url, data=d)
    

    - 请注意,dict d 在此处转换为 JSON 字符串!

    如果第二个代码相同(为了完整性,复制它):

    import requests
    import json
    d = {'a': 1}
    response = requests.post(url, json=d)
    

    ...那么结果会大不相同。

    第一个代码将生成一个内容类型设置为application/x-www-form-urlencoded 的请求,并且数据采用这种格式,因此:"a=1"

    第二个代码将生成一个内容类型设置为 application/json 的请求,实际上是这种格式的数据,所以 {"a": 1} - 一个 JSON 字符串。

    【讨论】:

    • 我在测试场景中遇到了这种情况,json 参数正在通过测试 - 剥离它确保我们测试有效负载,就像它像数据参数一样通过时一样。 load(request.data.strip(b'"')) 感谢您的贡献!
    【解决方案2】:

    这里仅根据我的经验谈,但请注意,最好将 json 字段与 dict 一起使用,而不是将 dict 转储到 data 字段中。

    再次,仅凭经验说话,我没有研究代码本身,但似乎请求库比json.dumps 做了一些更聪明的 json 序列化。在data 字段中使用json.dumps 时,我遇到了几个导致(FastAPI)服务器发出“值不是有效字典”错误响应的情况。改用 json 字段可以解决这些问题。

    编辑:我今天浏览了代码。如果您使用json 参数,请求库似乎真的只设置Content-Type 并转储它:

    from .compat import json as complexjson
    content_type = 'application/json'
    body = complexjson.dumps(json)
    if not isinstance(body, bytes):
        body = body.encode('utf-8')
    

    requests.compat 中,json 只是:

    try:
        import simplejson as json
    except ImportError:
        import json
    

    ...因此,我真的无法弄清楚为什么使用data 参数手动执行此操作有时无法正常工作。 ¯\_(ツ)_/¯

    【讨论】:

      【解决方案3】:

      要回答我自己的问题,我上面的两个示例似乎做了同样的事情,并且使用json 参数确实将标题中的content-type 设置为application/json。在我上面使用data 参数的第一个示例中,标题中的content-type 需要手动设置。

      【讨论】:

      • 这表现得像 API 应该表现的那样。你也可以在这里查看github.com/kennethreitz/requests/blob/master/requests/…
      • 同意,只是没有实际阅读代码就没有记录在任何地方。
      • 这确实是理智的行为,但正确记录它会有所帮助。 json=data 数据是字典不一定很明显。我的第一直觉是json=json.dumps(data),因为它感觉更准确。然后我在远程 API 端遇到了不相关的错误,因为它正在接收进一步编码为 json 的 json 字符串的结果(即双重转储)。很难检测,因为它是一个简单的字符串,因此仍然是有效的 json。更令人困惑的是,在记录接收端获得的内容时,无论是字符串还是字典形式的输出都无法区分。
      猜你喜欢
      • 1970-01-01
      • 2023-02-03
      • 2016-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-02
      • 1970-01-01
      相关资源
      最近更新 更多