【问题标题】:python making POST request with JSON datapython使用JSON数据发出POST请求
【发布时间】:2014-08-06 21:47:29
【问题描述】:

我正在尝试模仿我正在使用 python 调用的 curl 请求。请注意,

  • HTTPS 请求
  • 忽略 SSL 认证验证
  • 我的服务器是 django

我使用的curl命令是

curl -k --dump-header - -H "Content-Type: application/json" -X POST --data '{"environment_name": "foo"}' https://localhost/api/v1/environment/

服务器响应成功

HTTP/1.1 201 CREATED
Date: Tue, 17 Jun 2014 00:59:59 GMT
Server: Server
Vary: Accept-Language,Cookie,User-Agent
Content-Language: en-us
Location: https://localhost/api/v1/environment/None/
Status: 201 CREATED
Content-Length: 0
Cneonction: close
Content-Type: text/html; charset=utf-8

但是,当我尝试在 python 中使用“请求”进行发布请求时,我的脚本是

import json
data = {'enviornment_name' : 'foo'}

headers = {'Content-type' : 'application/json'}
response = requests.post("https://localhost/api/v1/environment", headers=headers, data=data, verify=False)

运行脚本时,我得到一个巨大的堆栈跟踪,但红色部分是

E                   DecodeError: ('Received response with content-encoding: gzip, but failed to decode it.', error('Error -3 while decompressing: incorrect data check',))

我不知道为什么我的脚本不能通过 python 工作

【问题讨论】:

  • 尝试使用json.dump(data)编码data
  • 请在此处阅读文档:docs.python.org/2/library/json.html
  • @Fabricator 它返回了相同的错误,尽管我确实注意到堆栈跟踪的较高位置显示了错误代码 403,所以发布请求可能与 curl 所做的不同?
  • 很奇怪。不用verify=False试试?
  • @Fabricator 我需要 verify=False 但是我注意到我的代码中有一个问题是我正在使用的服务器的问题,我需要在 URI 末尾添加尾随“/”。此外,我还需要 json.dumps(data) 而不是 json.dump(data) 以防其他人正在寻找。

标签: python json curl python-requests


【解决方案1】:

您的服务器声称返回 gzip'd 内容,但事实并非如此。响应在标题中返回 Content-Encoding: gzip。这可能是因为在请求中,默认情况下它发送Accept-Encoding: gzip, compress。除了 @Fabricator 在 cmets 中的建议之外,您还应该尝试在标题字典中将 "Accept-Encoding" 设置为 None。

您的标题字典将如下所示:

headers = {'Content-Type': 'application/json', 'Accept-Encoding': None}

您对请求的调用将如下所示

requests.post(url, headers=headers, data=json.dumps(data), verify=False)

【讨论】:

    【解决方案2】:

    @Fabricator 我需要 verify=False 但是我注意到我的代码中有一个问题是我正在使用的服务器的问题,我需要在 URI 末尾添加尾随“/”。此外,我还需要 json.dumps(data) 而不是 json.dump(data) 以防其他人正在寻找。感谢您的帮助

    【讨论】:

      猜你喜欢
      • 2022-07-27
      • 1970-01-01
      • 2012-06-25
      • 2017-11-28
      • 2016-07-28
      • 1970-01-01
      • 1970-01-01
      • 2011-05-11
      • 1970-01-01
      相关资源
      最近更新 更多