【问题标题】:Python requests.post() returns NonePython requests.post() 返回无
【发布时间】:2018-06-03 06:43:18
【问题描述】:

我知道之前讨论过这个问题,但我找不到适合我用例的有效解决方案。

我们有一个返回数据的内部服务器(抱歉,没有可用的外部地址)。在端点上调用 POST 方法会返回一个 JSON。我尝试使用Postman tool 发布帖子以检查是否收到有效回复。使用邮递员时,我收到了预期的响应。不需要身份验证。

但是,Python Client 无法返回数据,并收到一个空响应。

代码 sn-p:

import json
import requests

URL_PATH = "https://our.internal.server.rest.address"
HEADERS = {
    'Content-Type': 'application/json'
}

DATA = '''{
    "method"  : "object.read",
    "params"  : "",
    "id"      : 142
}'''

S = requests.session()
R = S.post(URL_PATH, headers=HEADERS, json=DATA)

if R.ok:
    print("Type: ", R.headers["Content-Type"])
    print("Text: ", str(R.text))
    print("JSON: ", R.json())
    print("Content", R.content)
else:
    R.raise_for_status()

S.close()

输出是:

类型:应用程序/json
文本:空
JSON:无
内容 b'null'

知道我的 Python 代码有什么问题吗?为什么没有返回数据,但是是在使用单独的工具时?

我也尝试在 post() 中使用 data=:

S.post(URL_PATH, headers=HEADERS, data=json.dumps(DATA))

或直接使用 requests.post() 跳过 Session()。

【问题讨论】:

  • 你能发送任何请求吗?尝试对另一个 URI 发出简单的GET 请求,你会得到正确的响应吗?
  • 不确定,但 Postman 肯定允许您将查询导出为 curl 命令。你能把它贴在这里吗?所以我们可以检查是否有任何区别
  • 这是一个很棒的建议!是的,我发现菜单选项将请求提取为 Python 的代码。知道吗?现在它起作用了!不知道究竟是什么错误。邮递员通过 response = requests.request("POST", url, data=payload, headers=headers) 发送请求,但 requests.post() 也可以正常工作。我会放弃下面的工作片段......

标签: python json rest post python-requests


【解决方案1】:

我相信您的 DATA 变量应该是字典而不是字符串?

【讨论】:

  • 所以具体建议是从您的DATA 分配中删除两个'''
【解决方案2】:

1) 用不同的端点尝试相同的代码。

这意味着在 Postman 中发送的确切参数不会添加到客户端中。

尝试使用 Apache tcpmon https://ws.apache.org/tcpmon/ 来窥探来自邮递员和 python 客户端的请求。

这将帮助您识别缺失的参数。

【讨论】:

    【解决方案3】:

    感谢大家的快速支持。这是运行良好的最终版本!

    import json
    import requests
    
    URL_PATH = "https://our.internal.server.rest.address"
    HEADERS = {
        'Content-Type': 'application/json'
    }
    
    DATA = {
        "method"  : "object.read",
        "params"  : "",
        "id"      : 142
    }
    
    # R = requests.request("POST", URL_PATH, data=payload, headers=HEADERS)  # suggested by Postman
    R = requests.post(URL_PATH, json=DATA, headers=HEADERS)
    
    if R.ok:
        print("JSON: ", R.json())
    else:
        R.raise_for_status()
    

    【讨论】:

      【解决方案4】:

      我在获得回复时遇到了同样的问题,我尝试了很多方法。原来是数据格式的问题。当我直接发送字典时,响应为空(状态码为 200)。当我发送一个 json 字符串作为数据时,我得到了预期的响应。

      import json
      
      DATA = {
          "method"  : "object.read",
          "params"  : "",
          "id"      : 142
      }
      
      # R = requests.request("POST", URL_PATH, data=payload, headers=HEADERS)  # suggested by Postman
      R = requests.post(URL_PATH, json=json.dumps(DATA), headers=HEADERS)
      

      【讨论】:

        猜你喜欢
        • 2023-03-16
        • 2019-12-15
        • 2019-09-03
        • 2020-12-27
        • 2019-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多