问题重述:
首先看前端的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 {
@Override
protected 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);
}
}
}