request.put()但它在我的python上使用PUT请求GET

时间:2017-08-14 07:55:53

标签: python http python-requests wireshark put

即使我使用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”。

wireshark packet

我的代码出了什么问题?

增加了更多。

我更正了下面的代码,我通过检查r.history找到了302重定向。 但仍然坚持为什么302发生了 当我与邮递员相比时。它显示正确。

Comparison with postman

另外第二名。 requests variable watch window

2 个答案:

答案 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