即使我使用requests.put()
,服务器也会将其请求识别为“GET”。
这是我的代码。
import requests
import json
url = 'https://api.domain.com/test/partners/digital-pie/users/assignee'
payload = """
{
"assignee": {
"district": "3",
"phone": "01010001000",
"carNum": "598865"
},
"deduction": {
"min": 1000,
"max": 2000
},
"meta": {
"unit-label": "1-1-1",
"year": "2017",
"quarter": "2"
}
}
"""
headers = {"content-type": "application/json", "x-api-key": "test_api_dp" }
r = requests.put(url, data=json.dumps(payload), headers=headers)
print("status code:", r.status_code)
print('encoding:', r.encoding)
print('text:', r.text)
print('json:', r.json())
当我通过wireshark检查包装时,我可以知道我的代码是“GET”。
我的代码出了什么问题?
增加了更多。
我更正了下面的代码,我通过检查r.history找到了302重定向。 但仍然坚持为什么302发生了 当我与邮递员相比时。它显示正确。
答案 0 :(得分:2)
您几乎可以肯定重定向。 PUT请求已发送,但服务器以3xx redirection response code响应,然后requests
跟随并发出GET请求。我注意到你的wireshark屏幕截图中的路径与代码中使用的路径不匹配(缺少/test
前缀),这进一步增加了重定向的证据。
您可以通过查看r.history
(每个条目是另一个响应对象)来检查redirection history,或将allow_redirects=False
设置为不响应重定向(您获得第一个响应,没有别的)。
您可能正在重定向,因为您正在双重编码您的JSON有效负载。无需在已经是JSON文档的字符串上使用json.dumps
。您正在发送单个JSON字符串,其内容恰好是JSON文档。这几乎肯定是错误的发送。
通过删除json.dumps()
来电,或将payload
字符串替换为字典来解决此问题:
payload = {
"assignee": {
"district": "3",
"phone": "01010001000",
"carNum": "598865"
},
"deduction": {
"min": 1000,
"max": 2000
},
"meta": {
"unit-label": "1-1-1",
"year": "2017",
"quarter": "2"
}
}
顺便说一句,你最好使用json
关键字参数;你得到Content-Type: application/json
标题是一个额外的奖励:
headers = {"x-api-key": "test_api_dp" }
r = requests.put(url, json=payload, headers=headers)
同样,这假设payload
是Python数据结构,不是 Python字符串中的JSON文档。
答案 1 :(得分:0)
您可以使用http://httpbin.org
简单地测试使用的方法>>> import requests
>>> r = requests.put('http://httpbin.org/anything')
>>> r.content
b'{\n "args": {}, \n "data": "", \n "files": {}, \n "form": {}, \n
"headers": {\n "Accept": "*/*", \n "Accept-Encoding": "gzip, deflate",
\n "Connection": "close", \n "Content-Length": "0", \n "Host":
"httpbin.org", \n "User-Agent": "python-requests/2.18.3"\n }, \n
"json": null, \n "method": "PUT", \n "origin": "91.232.13.2", \n "url":
"http://httpbin.org/anything"\n}\n'
如您所见,使用的方法是PUT