本文中使用Postman来模拟前端发送请求。
1.前端发送一个POST请求(application/x-www-form-urlencoded类型),请求中有参数bookName ,其值是中文。
2.后端进行接收,我们这里写的是,使用Controller接收,当然也可以使用servlet类,只要能获取到请求request。
方法一:使用HttpServletRequest
@CrossOrigin
@RequestMapping(value = "/api/findBookByName", method = RequestMethod.POST)
@ResponseBody
public void deleteBookByNumber(HttpServletRequest request, HttpServletResponse response) throws Exception{
request.setCharacterEncoding("utf-8");
String bookName = request.getParameter("bookName");
System.out.println(bookName);
}
这里因为前端发送的是application/x-www-form-urlencoded编码类型,所以我们可以直接从获取前端的请求参数—> request.getParameter("bookName")
。因为中文乱码,所以这里设置字符编码方式。
方法二:使用注解@RequestParam
@CrossOrigin
@RequestMapping(value = "/api/findBookByName", method = RequestMethod.POST)
@ResponseBody
public void deleteBookByNumber(@RequestParam("bookName") String bookName) throws Exception{
bookName=new String(bookName.getBytes("ISO-8859-1"), "utf-8");
System.out.println(bookName);
}
这里也可以使用@RequestParam("bookName")
获取请求参数。因为GET和POST请求传的参数会自动转换赋值到@RequestParam 所注解的变量上。
RequestParam实质是将Request.getParameter() 中的Key-Value参数Map利用Spring的转化机制ConversionService配置,转化成参数接收对象或字段。所以这个方法只能针对application/x-www-form-urlencoded编码类型使用。
在ConversionService类里面,将请求参数的编号方式设为ISO-8859-1,所以我们需要修改为utf-8.
这里写了针对application/x-www-form-urlencoded编码类型的二种后台接收方式,但是都需要对中文乱码问题进行处理,其实还有一种更为简便的方法。设置字符过滤器(文章链接)
上面我们说了,对于application/x-www-form-urlencoded编码类型的后台接收方式。现在我们说说对于application/json编码类型的后台接收方式。
3,前端发送一个POST请求(application/json类型),请求中有参数bookName ,其值是中文。
4,后台接收application/json类型的POST请求。
方法一:使用@ResponseBody注解,定义包含所有参数的对象,直接封装到对象属性中
@CrossOrigin
@RequestMapping(value = "/api/deleteBook", method = RequestMethod.POST)
@ResponseBody
public Boolean deleteBook(@RequestBody String map) throws Exception{
JSONObject mapJson=JSONObject.fromObject(map);
if(mapJson!=null) {
bookmapper.deleteBook(String.valueOf(mapJson.get("bookNumber")));
return true;
}
return false;
}
这里我们暂时使用了String类封装了所有的参数对象,然后使用JSONObject.fromObject()将String类型转化为JSON对象,使用JSONObject .get("") 方法提取名称对应的键值。这里提一下JSON.parse()的作用是将JSON字符串转化为JSON对象。这里仍会出现中文乱码问题,请照上面2中的方法一、二进行修改。
方法二:通过request获取流,
@CrossOrigin
@RequestMapping(value = "/api/findBookByName", method = RequestMethod.POST)
@ResponseBody
public void deleteBookByNumber(HttpServletRequest request, HttpServletResponse response) throws Exception{
String s = StreamUtils.copyToString(request.getInputStream(), Charset.forName("UTF-8"));
JSONObject mapJson=JSONObject.fromObject(s);
}
使用从request中获取流,并设置中文编码,封装到一个String对象中。将String转化为JSON,我们就可以提取名称对应的键值。
最后,我比较推荐使用注解方式,并且使用JSON类型。因为我们可以直接将JSON对象转化为我们自定义类对象。感觉用起来比较方便,当然如果是参数很少,使用@RequestParam更加方便。
5.前端如何获取后台返回的数据。
这里我举一个例子,如后台返回这种数组:
我在前端 通过 res.data 获取到的会是json字符串,这里我就可以用过函数JSON.parse(res.data)
将json字符串转化为json对象,这里前端获取的就是这样的数组
多说一句: JSON.stringify()
函数是将json对象转化为对应的json 字符串。