使用JSON发送POST请求调用Flask API时遭遇500内部服务器错误
问题原因与解决方法
你遇到的问题核心是requests库的json参数用法错误:
- 当你用
json=myjsonobj传入json.dumps()生成的字符串时,requests会把这个字符串当作JSON的原始值发送,相当于后端收到的是一个被双重编码的JSON(比如"{\"user\":\"xxx\",...}")。Flask后端用request.get_json()解析时,得到的是一个字符串而非预期的字典,直接导致解析失败,返回500错误。 - 而手动构造字典传入时,requests会自动把字典序列化为正确的JSON字符串,并设置
Content-Type: application/json请求头,后端能正常解析。
修正后的代码
直接传入原始字典即可,不需要手动调用json.dumps():
import requests def sendpushoverapi(user, title, content, priority=0, url='', urltitle=''): posturl = 'http://192.168.1.96:5000/spo' myobj = { "user": user, "title": title, "message_content": content, "priority": priority, "url": url, "url_title": urltitle } # 直接传字典给json参数,requests会自动处理序列化和请求头 x = requests.post(posturl, json=myobj) print(x.text)
补充说明
如果非要手动序列化JSON字符串(不推荐),需要用data参数并手动设置请求头:
import requests import json def sendpushoverapi(user, title, content, priority=0, url='', urltitle=''): posturl = 'http://192.168.1.96:5000/spo' myobj = { "user": user, "title": title, "message_content": content, "priority": priority, "url": url, "url_title": urltitle } myjsonobj = json.dumps(myobj) # 用data传字符串,手动设置Content-Type x = requests.post(posturl, data=myjsonobj, headers={"Content-Type": "application/json"}) print(x.text)
但第一种方法更简洁,也符合requests库的设计初衷。
内容的提问来源于stack exchange,提问作者Sherwood12
相关产品推荐
相关产品推荐

