springMvc参数解析讲解

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()方法来解析的)。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值