Python requests发送POST请求提交JSON返回404错误问题求助
排查结论
404错误是请求路径和后端路由不匹配导致的,除此之外前后端代码还有3处会导致请求失败的逻辑问题,逐一修正即可:
- 路径不匹配问题:后端注册的POST路由为
/api/add,Python代码里写的请求地址是/api/places,服务器找不到对应资源直接返回404,把请求URL改成https://f053a068dd0ea6.lhrtunnel.link/api/add即可解决404问题。 - Python端传参错误:当前
data='./j.json'的写法是把字符串./j.json当成请求体发送,既没有读取本地JSON文件内容,也没有设置正确的JSON请求头,后端无法解析到参数。 - 后端缺少请求体解析配置:Express默认不会解析JSON格式请求体,没有配置
express.json()中间件的话,req.body会是undefined,拿不到任何传入参数。 - 后端SQL拼接存在注入风险:直接把用户传入的参数拼到SQL语句里,存在严重SQL注入漏洞,建议改用参数化查询。
修正后可运行代码
Python端
import requests import json url = "https://f053a068dd0ea6.lhrtunnel.link/api/add" # 读取本地JSON文件内容 with open("./j.json", "r", encoding="utf-8") as f: payload = json.load(f) # 用json参数自动序列化数据、设置正确请求头 resp = requests.post(url, json=payload) print(resp.status_code, resp.text)
Node.js/Express后端
在路由定义前添加JSON解析中间件,同时修改SQL为参数化写法:
const express = require('express') const app = express() // 必须在路由定义前添加,否则无法解析JSON请求体 app.use(express.json()) app.post('/api/add', (req, res) => { const {place_name, score, description, img_url, address} = req.body; // 参数化查询避免SQL注入 const insertSql = "INSERT INTO place VALUES (0, ?, ?, ?, ?, ?)"; const sqlParams = [place_name, score, description, img_url, address]; connection.query(insertSql, sqlParams, (error, rows) => { if(error) { console.error(error); return res.status(500).send({msg: "插入失败", error}); } res.send(rows); }) })
内容的提问来源于stack exchange,提问作者YuLim2
相关产品推荐
相关产品推荐

