我知道此问题已在前面讨论过,但我无法找到适合我用例的工作解决方案。
我们有一个返回数据的内部服务器(抱歉,没有可用的外部地址)。在端点上调用POST方法将返回JSON。我尝试使用Postman tool发布帖子来检查是否收到了有效的回复。使用邮递员时,我按预期收到回复。不需要身份验证。
但是,Python客户端无法返回数据并收到空响应。
代码段:
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()
输出结果为:
键入:application / json
文字:null
JSON:没有 内容b'null'
知道我的Python代码出了什么问题,为什么没有返回数据,但是在使用单独的工具时呢?
我也尝试在post()中使用data =:
S.post(URL_PATH, headers=HEADERS, data=json.dumps(DATA))
或直接使用requests.post()跳过Session()。
答案 0 :(得分:2)
1)尝试使用不同端点的相同代码。
这意味着Postman中发送的确切参数不会添加到客户端中。
尝试使用Apache tcpmon https://ws.apache.org/tcpmon/来监听来自post man和python客户端的请求。
这将帮助您识别缺少的参数。
答案 1 :(得分:1)
我相信你的DATA
变量应该是dict而不是字符串?
答案 2 :(得分:0)
感谢大家的快速支持。这是最终版本,效果很好!
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()
答案 3 :(得分:0)
我在获得响应时遇到了同样的问题,并且尝试了很多事情。事实证明,这是数据格式的问题。当我直接发送字典时,响应为空(状态代码为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)