Python向Express服务器发送POST请求,Node端未接收到JSON数据
Python POST请求到Express服务器接收为空?看这里!
我一眼就看出问题所在啦——你用requests.post的data参数传递了嵌套结构的数据,但Express默认解析的是表单编码格式,这种格式搞不定嵌套的数组/对象,所以服务器端拿到空对象。而Postman测试正常,是因为你在Postman里肯定是用JSON格式发的请求对吧?
问题根源
当你用data参数传递字典时,requests会把数据编码成application/x-www-form-urlencoded格式(也就是表单提交的格式),但这种格式只能处理扁平的键值对,没法处理chat字段里的数组嵌套结构。而Express的express.json()中间件只会解析Content-Type为application/json的请求,所以自然拿不到数据。
两种解决办法
方法1:直接用json参数(最推荐)
requests提供了json参数,会自动帮你把数据序列化成JSON字符串,同时设置正确的Content-Type: application/json请求头,一步到位:
import requests print("started"); URL = "http://localhost:5000/api/chat" PARAMS = {'ID':"99","otherID":"87",'chat':[{"senderName":"tom","text":"helloworld"}]} # 把data换成json参数 r = requests.post(url=URL, json=PARAMS) pastebin_url = r.text print("The pastebin URL is:%s"%pastebin_url)
方法2:手动序列化+设置请求头
如果你想自己控制序列化过程,可以用json.dumps把字典转成JSON字符串,然后手动设置请求头:
import requests import json print("started"); URL = "http://localhost:5000/api/chat" PARAMS = {'ID':"99","otherID":"87",'chat':[{"senderName":"tom","text":"helloworld"}]} # 手动将数据序列化为JSON字符串 json_data = json.dumps(PARAMS) # 设置Content-Type请求头,告诉服务器这是JSON数据 r = requests.post(url=URL, data=json_data, headers={'Content-Type': 'application/json'}) pastebin_url = r.text print("The pastebin URL is:%s"%pastebin_url)
这样修改之后,Express服务器就能正确解析你的请求数据啦!
内容的提问来源于stack exchange,提问作者Alexander
相关产品推荐
相关产品推荐

