springMvc参数解析讲解
笔者将结合Postman来分析SpringMVC如何解析不同请求方式的参数,通过示例告知读者不同content-type媒体类型的请求解析方式是不一样的。在请求中 (如POST 或 PUT),客户端通过content-type告诉服务器实际发送的数据类型。不同的数据类型解析方式也会有很大的不同,我们通过阅读Servlet规范中ServletRequest接口的方法,寻找不同数据类型的解析方法。规范由不同的服务器厂商来实现。
一. 普通get请求:
普通get请求参数和url一起发送到服务器,springMVC可通过request.getParam(“具体参数键值”)方式,或者直接通过springMVC封装好的样式直接接收.
postman发送请求代码接收请求:
@RestController
public class ParamController {
@RequestMapping("/test/get")
public void testGet(String name,Integer age){
System.out.println("student's name:"+name +"\nsutdent's age:"+age);
}
}
二.post请求
1.表单提交,此时content-type为application/x-www-form-urlencoded。http数据放到了请求体中,J2EE规范中ServletRequest对象为接收数据的接口,该接口定义了相关的方法,不同的服务器实现了相关的规范(Tomcat weblogic),request.getParam(“具体参数键值”)方式,或者直接通过springMVC封装好的样式直接接收.
ServletRequest代码片段
postman发送请求:
代码接收请求:
@RequestMapping("/test/post-x-www-form-urlencoded")
public void testPostXWwwFormUrlencode(String name,Integer age){
System.out.println("student's name:"+name +"\nsutdent's age:"+age);
}
2.content-type为application/json的post请求
postman发送请求
假如我们还用request.getParam这种方式获取参数中的数据我们发现数据接收后全部为null
此时我们应该使用request.getInputStream或者request.getReader来获取请求体中的二进制流,注意二者不可一起使用,因为request中的二进制流不可重复读取。
代码接收
@RequestMapping("/test/post-application-json")
public void testPostApplicationJson(HttpServletRequest request){
String content = readInputData(request);
System.out.println(content);
}
public String readInputData(HttpServletRequest request) {
StringBuilder builder = new StringBuilder();
BufferedReader reader = null;
try
{
reader = request.getReader();
String line;
while ((line = reader.readLine()) != null)
{
builder.append(line);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (reader != null)
{
try {
reader.close();
} catch (Exception e) {
}
}
}
return builder.toString();
}
3.content-type为multipart/form-data
这种媒体类型主要用来传输数据和文件,我们通过使用CommonsMultipartResolver来解析其中的数据和文件(查看源码发现参数也是通过调用request.getParamter()方法来解析的),本篇只讨论接受参数数据
首先引入相关的依赖
postman发送请求
代码接收请求
@RequestMapping("/test/post-mutipart-form-data")
public void testPostMutipartFormData(HttpServletRequest request){
MultipartResolver resolver = new CommonsMultipartResolver(request.getSession().getServletContext());
MultipartHttpServletRequest params = resolver.resolveMultipart(request);
String name = params.getParameter("name");
int age = Integer.valueOf(params.getParameter("age"));
System.out.println("student's name:"+name +"\nsutdent's age:"+age);
}
总结
1.客户端通过content-type告诉服务器实际发送的数据类型
2.在数据交互中我们主要用到了request.getParameter()来解析application/x-www-form-urlencoded 和普通的get请求;使用request.getReader()或者request.getInputStream()方法来获取application/json的数据;使用CommonsMultipartResolver来解析其中的数据和文件(查看源码发现参数也是通过调用request.getParamter()方法来解析的)。