问题重述:
首先看前端的axios请求这里我使用params参数将data数据传给后端
let data = JSON.stringify(this.posts);axios.post("/blog_war_exploded/insertPost", {params: {data: data}}).then((res) => {if (res.data == "success") {alert("发布成功")} else alert("发布失败")});
后端我接受post请求的参数就需要使用流来读取这个我写的没有问题。但是发现对象可以打印出来,但是通过对象.属性名无法获取数据。
打印结果如下:(获取到的对象data被params包起来了导致无法获取title属性值)
解决方案有两种:
1:改写axios请求格式,不使用params参数,直接用axios.post("url",data)的方式传递参数
2:改写后端,先从 jsonObject
中获取 params
对象,再从 params
对象中解析出 data
字符串,再转换为 JSONObject,然后
从 dataObject
中提取需要的字段。
@WebServlet("/insertPost")
public class insertPost extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("UTF-8");resp.setCharacterEncoding("UTF-8");resp.setContentType("text/html;charset=UTF-8");JSONObject jsonObject = acceptPost(req);String title = jsonObject.getString("title");//获取其他参数、、、下面我将获取前端的对象打印了出来System.out.println("jsonObject = " + jsonObject);System.out.println("jsonObject.getString(\"title\") = " + jsonObject.getString("title"));GetMapper getMapper = new GetMapper();Integer posts = getMapper.insertPost(new posts(title, author, category, label, date, status, content));PrintWriter out = resp.getWriter();if (posts==1){out.write("success");}}/*** 接收并解析前端发送的POST请求的JSON数据** @param req HttpServletRequest对象,用于获取请求数据* @return 解析后的JSONObject对象,包含前端发送的参数*/public static JSONObject acceptPost(HttpServletRequest req) {try {// 创建BufferedReader对象,从请求输入流中读取数据BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(req.getInputStream(), "utf-8"));String data; // 用于临时存储每一行读取的数据StringBuilder stringBuilder = new StringBuilder(); // 用于存储整个请求的内容// 循环读取请求输入流中的数据,直到读完为止while ((data = bufferedReader.readLine()) != null) {stringBuilder.append(data);}// 将读取到的JSON字符串转换为JSONObject对象JSONObject jsonObject = JSONObject.parseObject(stringBuilder.toString());// 返回转换后的JSONObject对象return jsonObject;} catch (IOException e) {// 捕获IO异常并抛出运行时异常throw new RuntimeException(e);}}
}