• Spring接收web请求参数的几种方式


    1 查询参数

    请求格式:url?参数1=值1&参数2=值2...
    同时适用于GET和POST方式
    spring处理查询参数的方法又有几种写法:

    方法一:
    方法参数名即为请求参数名

      // 查询参数1
      @RequestMapping(value = "/test/query1", method = RequestMethod.GET)
      public String testQuery1(String username, String password) {
        System.out.println("username=" + username + ", password=" + password);
        return "username=" + username + ", password=" + password;
      }

    方法二:
    从HttpServletRequest中提取参数

      // 查询参数2
      @RequestMapping(value = "/test/query2", method = RequestMethod.GET)
      public String testQuery2(HttpServletRequest request) {
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        System.out.println("username=" + username + ", password=" + password);
        return "username=" + username + ", password=" + password;
      }


    方法三:
    方法参数名和请求参数名可以不一样,通过@RequestParam注解来绑定参数

      // 查询参数3
      @RequestMapping(value = "/test/query3", method = RequestMethod.GET)
      public String testQuery3(@RequestParam("username") String un, @RequestParam("password") String pw) {
        System.out.println("username=" + un + ", password=" + pw);
        return "username=" + un + ", password=" + pw;
      }


    方法四:
    创建一个实体类对象作为参数承载体,spring会根据参数名称自动将参数绑定到实体类对象的属性上

      // 查询参数4
      @RequestMapping(value = "/test/query4", method = RequestMethod.GET)
      public String testQuery4(User user) {
        String username = user.getUsername();
        String password = user.getPassword();
        System.out.println("username=" + username + ", password=" + password);
        return "username=" + username + ", password=" + password;
      }

    实体类定义如下:

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @Builder
    public class User {
      private String username;
      private String password;
    }

    这里用到了第三方库lombok,这样就不需要在代码中手动添加get、set等方法,lombok会自动添加。

    发送请求的curl命令如下:

    curl -i 'http://192.168.1.14:8080/test/query1?username=aaa&password=bbb'

    交互报文如下:

    GET /test/query1?username=aaa&password=bbb HTTP/1.1
    Host: 192.168.1.14:8080
    User-Agent: curl/7.58.0
    Accept: */*
    
    HTTP/1.1 200 
    Content-Type: text/plain;charset=UTF-8
    Content-Length: 26
    Date: Thu, 25 Oct 2018 07:01:30 GMT
    
    username=aaa, password=bbb

    2 表单参数

    请求参数不在url中,而是在Body体中,格式为:url?参数1=值1&参数2=值2...
    适用于POST方式
    表单参数处理方法和前面的请求参数处理方法几乎完全一样,只是RequestMethod注解中将method方法设置成POST方法

    方法一:

      // 表单参数1
      @RequestMapping(value = "/test/form1", method = RequestMethod.POST)
      public String testForm1(String username, String password) {
        System.out.println("username=" + username + ", password=" + password);
        return "username=" + username + ", password=" + password;
      }

    方法二:

      // 表单参数2
      @RequestMapping(value = "/test/form2", method = RequestMethod.POST)
      public String testForm2(HttpServletRequest request) {
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        System.out.println("username=" + username + ", password=" + password);
        return "username=" + username + ", password=" + password;
      }

    方法三:

      // 表单参数3
      @RequestMapping(value = "/test/form3", method = RequestMethod.POST)
      public String testForm3(@RequestParam("username") String un, @RequestParam("password") String pw) {
        System.out.println("username=" + un + ", password=" + pw);
        return "username=" + un + ", password=" + pw;
      }

    方法四:

      // 表单参数4
      @RequestMapping(value = "/test/form4", method = RequestMethod.POST)
      public String testForm4(User user) {
        String username = user.getUsername();
        String password = user.getPassword();
        System.out.println("username=" + username + ", password=" + password);
        return "username=" + username + ", password=" + password;
      }

     curl请求命令如下:

    curl -X POST -i -d "username=aaa&password=bbb" http://192.168.1.14:8080/test/form1

    请求和响应报文如下:

    POST /test/form1 HTTP/1.1
    Host: 192.168.1.14:8080
    User-Agent: curl/7.58.0
    Accept: */*
    Content-Length: 25
    Content-Type: application/x-www-form-urlencoded
    
    username=aaa&password=bbb
    
    HTTP/1.1 200 
    Content-Type: text/plain;charset=UTF-8
    Content-Length: 26
    Date: Thu, 25 Oct 2018 07:05:35 GMT
    
    username=aaa, password=bbb

    3 路径参数

    请求参数为url中的一部分,格式为:url/参数1/参数2...
    同时适用于GET和POST方式
    代码如下:

      @RequestMapping(value = "/test/url/{username}/{password}", method = RequestMethod.GET)
      public String testUrl(@PathVariable String username, @PathVariable String password) {
        System.out.println("username=" + username + ", password=" + password);
        return "username=" + username + ", password=" + password;
      }

    请求curl命令如下:

    curl -i http://192.168.1.14:8080/test/url/aaa/bbb

    请求和响应报文如下:

    GET /test/url/aaa/bbb HTTP/1.1
    Host: 192.168.1.14:8080
    User-Agent: curl/7.58.0
    Accept: */*
    
    HTTP/1.1 200 
    Content-Type: text/plain;charset=UTF-8
    Content-Length: 26
    Date: Thu, 25 Oct 2018 07:07:44 GMT
    
    username=aaa, password=bbb

    4 json格式参数

    请求参数在Body体中,并且为json格式。需要添加请求头:Content-Type: application/json;charset=UTF-8
    适用于POST方式
    方法一:
    定义实体类,将json对象解析成实力类,需要添加RequestBody注解

      // json参数1
      @RequestMapping(value = "/test/json1", method = RequestMethod.POST)
      public String testJson1(@RequestBody User user) {
        String username = user.getUsername();
        String password = user.getPassword();
        System.out.println("username=" + username + ", password=" + password);
        return "username=" + username + ", password=" + password;
      }

    方法二:
    如果不像定义实体类,也可以将json请求直接解析成JSONObject类

      // json参数2
      @RequestMapping(value = "/test/json2", method = RequestMethod.POST)
      public String testJson2(@RequestBody JSONObject json) {
        String username = json.getString("username");
        String password = json.getString("password");
        System.out.println("username=" + username + ", password=" + password);
        return "username=" + username + ", password=" + password;
      }

    方法三:
    也可以将json对象直接解析成Map对象

      // json参数3
      @RequestMapping(value = "/test/json3", method = RequestMethod.POST)
      public String testJson3(@RequestBody Map<String, String> userMap) {
        String username = userMap.get("username");
        String password = userMap.get("password");
        System.out.println("username=" + username + ", password=" + password);
        return "username=" + username + ", password=" + password;
      }

    请求curl命令如下:

    curl -X POST -i -H 'Content-Type: application/json;charset=UTF-8' -d '
    {
        "username" : "aaa",
        "password" : "bbb"
    }
    ' http://192.168.1.14:8080/test/json1

    请求和响应报文如下:

    POST /test/json1 HTTP/1.1
    Host: 192.168.1.14:8080
    User-Agent: curl/7.58.0
    Accept: */*
    Content-Type: application/json;charset=UTF-8
    Content-Length: 52
    
    
    {
        "username" : "aaa",
        "password" : "bbb"
    }
    HTTP/1.1 200 Content-Type: text/plain;charset=UTF-8 Content-Length: 26 Date: Thu, 25 Oct 2018 07:09:06 GMT username=aaa, password=bbb
  • 相关阅读:
    自定义View的ToolBar布局报错Error:(2) No resource identifier found for attribute 'context' in package 'c
    在学git之主分支 branch
    获取发布版SHA1
    关于开启线程与UI的操作
    播放音频和视频(VideoView控件)
    通知栏Notification的应用
    Android 真机调式 Installation failed with message 远程主机强迫关闭了一个现有的连接。. It is possible that this issue is resolved by uninstalling an existing version of the apk if it is present, and then re-installing. WA
    运行程序申请危险权限
    mysql乐观锁总结和实践
    Nginx配置文件nginx.conf中文详解
  • 原文地址:https://www.cnblogs.com/lasdaybg/p/9849883.html
Copyright © 2020-2023  润新知