【问题标题】:How to troubleshoot a Python Requests POST failure when the same POST is working fine in Postman?当相同的 POST 在 Postman 中正常工作时,如何解决 Python 请求 POST 失败?
【发布时间】:2018-09-08 23:29:46
【问题描述】:

在发出在 Postman 中正常工作的 POST 请求时,我继续从 python 请求中收到一条非常通用、无用的错误消息。

无论我尝试什么,我都会继续收到两条错误消息之一。请注意,调用python脚本有第155行,也不有效载荷是否包含字母“u”:

{"error":{"detail":"SyntaxError: Unexpected token: u (sys_script_include.d2426c9ec0a8016501958bf2ac79c775.script; line 155)","message":"Unexpected token: u"},"status":"failure"}

{"error":{"message":"Unexpected token: u","detail":"SyntaxError: Unexpected token: u (sys_script_include.d2426c9ec0a8016501958bf2ac79c775.script; line 155)"},"status":"failure"}

Postman中,参数被正确解释后附加到url如:

https://areallylongurl?params={"catalogItem": "Req Name"}

Python 请求中,我尝试了各种组合,但都没有运气。

payload = {"params": '{"catalogItem": "Req Name"}'}
response = requests.post(url, headers=headers, json=payload, verify=False)
response = requests.post(url, headers=headers, json=json.dumps(payload), verify=False)
response = requests.post(url, headers=headers, data=payload, verify=False)
response = requests.post(url, headers=headers, data=json.dumps(payload), verify=False)

通过using this very helpful SO answer,我能够进一步分析 Requests 库如何解释我提供的有效负载,但我仍然不确定如何解释这个通用错误消息,或者原因可能是什么。

有没有人想过潜在的问题可能是什么?请注意,我可以从这个 API 获取,而不会从请求中遇到问题,只有 POST 有问题。

【问题讨论】:

  • 究竟是什么产生了这些 JSONic 错误消息?这是响应,还是另一个程序调用了使用请求的脚本?

标签: python python-3.x python-requests


【解决方案1】:

由于在邮递员中,参数像https://areallylongurl?params={"catalogItem": "Req Name"}一样“附加到url”,这意味着请求很可能是一个GET请求,其中JSON作为一个值传递给params参数,而不是一个POST的有效负载请求,在这种情况下,您应该这样做:

response = requests.get(url, headers=headers, params={"params": json.dumps(payload)}, verify=False)

【讨论】:

  • 哇!这解决了我的问题,您为我节省了无数小时的故障排除时间,所以我非常感谢您。但是您介意详细说明您是如何解决此问题的吗?是什么提示您这是问题/修复?此外,您的代码 sn-p 正在使用 get 方法,但同样的方法适用于 post 方法:payload = {"catalogItem": "Req Name"} response = requests.post(url, headers=headers, params={"params": json.dumps(payload)}, verify=False)
  • 很高兴能提供帮助。您成功用于邮递员的 URL 告诉了人们应该知道的一切,以使请求工作。 GET 请求的惯例是将查询字符串以 <parameter name>=<value> 对的形式附加到 URL,并在问号 ? 之后由 &s 分隔。因此,从 URL https://areallylongurl?params={"catalogItem": "Req Name"} 可以明显看出,服务器期待一个带有名为 'params' 的参数的 GET 请求,其值是 JSON 格式的,因此您应该使用 requests.getparams 发出这样的请求相应的参数。
  • 通常 GET 和 POST 方法在相同的 API 下都可以工作,因为大多数 Web 应用程序框架以相同的方式处理来自 GET 和 POST 请求的参数,因此 Web 应用程序可以对这两种类型的请求使用一致的逻辑.
猜你喜欢
  • 2018-06-10
  • 2023-04-06
  • 2019-10-11
  • 1970-01-01
  • 2019-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多