最近扒别人API,虽然前端都是以application/json来发送的,但是我用application/x-www-form-urlencoded,
multipart/form-data,都是可以请求成功的。
虽然百思不得其解为什么前后端不能就约定接收json,但是既然别人做了,那么就来学习下,如何同时接收不同的请求
content-type:application/json
如果单独要使用解析json在springboot下其实非常简单,使用@ReseponceBody 注解 即可。
public void test(@ReseponceBody JsonBean jsonBean){
---其他逻辑
}
单独解析下面两个同样也是非常简单,使用@RequestParam
content-type:application/x-www-form-urlencoded
multipart/form-data
@PostMapping("/test")
public void testDo(Integer page,@RequestParam(name = "page_size") Integer pageSize ) {
//请求参数为 page=1&page_size=20
//page参与同名不需要用注解
//page_size参数不同名,用注解即可解析
}
这样看起来都是非常简单,
思来想去,还是只能用HttpServletRequest 着手。
HttpServletRequest提供了 getHeader(String s) 方法,可以获取请求头。
通过判断请求头,来知道他用的什么类型。
String header = request.getHeader("content-type");
这样获取的请求头,在对应multipart/form-data的时候,他会有多的分割字符串,所以必须spit一下。(如果不知道请求头的全部,建议自己去尝试一下)。
HttpServletRequest提供了 getParameterValues(String s) 方法,来获取请求的值
但是这个方法并不能获得json字符串。
他还提供了另外一个方法getReader(),来获取IO流。
我们可以通过IO流来获取json。
最后上代码:
@PostMapping("/test1")
public void doTest(HttpServletRequest request ) {
String header = request.getHeader("content-type");
String[] split = header.split(";");//multipart/form-data 需要分割,对其他请求无影响
switch (split[0]) {
case "application/json":
StringBuffer buffer = new StringBuffer();
String line = null;
try {
BufferedReader reader = request.getReader();
while ((line = reader.readLine()) != null) {
buffer.append(line);
}
} catch (IOException e) {
e.printStackTrace();
}
//buffer就是获取到的json,这里解析json即可
break;
case "application/x-www-form-urlencoded":
String[] pages = request.getParameterValues("page");
String[] pageSizes = request.getParameterValues("page_size");
break;
case "multipart/form-data":
String[] pages1 = request.getParameterValues("page");
String[] pageSizes1 = request.getParameterValues("page_size");
break;
default:
System.out.println("未知请求:" + split[0]);
break;
}
}