在最近一次码字过程中,遇到一个问题,很简单的需求,通过http请求一个服务器的数据。最初始的代码如下:
param = {"fileName": name, "token": token}
resp = requests.post(url=base_url, data=param)
代码很简单,但是服务器一直提示错误,客户端收不到结果
w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported]
然后加上header参数,再次进行调试
headers = {
"Accept": "application/json, text/javascript, */*; q=0.01",
"Content-Type": "application/json",
"Accept-Language": "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3",
"Accept-Encoding": "gzip, deflate",
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"
}
param = {"fileName": name, "token": token}
resp = requests.post(url=base_url, headers=headers,data=param)
依然报错。
经过反复调试,把代码改成下面的方法就可以了
resp = requests.post(url=base_url, headers=headers,data=param)
回头想想,问题的根本解决是把requests.post 的参数 “data”改成了“json”。
那么 requests中“data”和“json”这两种形式到底有什么区别呢?
在 Python 中使用 requests 库的 post 方法,可以通过 data 参数向服务器发送数据。
如果把该参数设置为 JSON 格式的数据,则该请求会被视为一个 JSON 请求,同时请求的 Content-Type 字段也会被设置为 application/json。
与此同时,如果使用的是 requests.post(…, json=json_data) 的形式,这样的请求就会更加方便,因为它会自动设置 Content-Type 为 application/json,并将请求数据序列化为 JSON 格式。
因此,
- 如果需要发送 JSON 格式的数据,应该使用 requests.post(…, json=json_data) 的形式。
- 如果需要使用其他格式的数据,则需要使用 data 参数,使用使用 requests.post(…, data=datas) 的形式