后端如何接收参数

413 阅读5分钟

如何接收参数:

接收 来自前端(浏览器)传过来的 地址上的参数(参数有多种)!!!!!
    
 我们重点学习:如何接收前端发送的各种类型的参数;!!!!!!

1.param和json

1)param和JSON的对比:

1.param参数形式:
   key=value & key=valeu
2.json参数形式:
   {key:value,key:value}
3.param 和 JSON 两种参数形式的比较:
     (1)参数编码:
         param:Ascall编码; JSON:UTF-8;
      (2)参数顺序:
          param:参数没有顺序;
          JSON:参数有顺序; 
      (3)数据类型:
           param:只支持字符串类型; eg:在前端传来参数:name=张三&age=18 最终都会转换成字符串类型;
           json:可以装多种;
      (4)嵌套性:
           param:无嵌套:只有1层
           json:可以无限嵌套,只要符号json的格式;
       (5)可读性:
           简单的参数:param读起来较为简单
           复杂的参数:json读起来清晰;
           
      注意:一般使用JSON,且JSON格式传递要求请求方式必须是POST;!!!!!!!!!

2.param方式如何接收参数:

(2)如何接收前端发送的Json和param类型的参数;



    接收方式有三种:
  1.直接接收:
  
  2.注解指定
  
  3.特殊值
  
  4.使用实体类对象接收;
      

    /*
    1.直接接收:(直接接值)
      eg:!!!当前端发送:/param/data?name=root&age=18
      如何接收:handler方法的形参列表 填写对应名称的参数即可!  形参参数名= 前端访问的参数名 即可;
      1.名称相同; 2.可以不传递,不会报错;
     */
    //handler方法:
    @RequestMapping("/data")  //将handler注册到handlerMapper + 外部访问handler的地址;
    @ResponseBody
    public  String data(String name,int age){
        System.out.println("name = " + name + ", age = " + age);
        return "name =" +name+"age ="+age;

    }

    /*
    2.注解指定:(注解接值)
    @RequestParam:放在形参列表,用来指定:请求参数名 或者 是否必须传递 或者非必须传递情况下设置默认值;
    用法:@RequestParam(value="指定请求参数名":如果新参名称和请求参数名一样可以省略;如果指定了value,原来的参数就会失效,只有传入指定的参数才会生效:
                       required=false:前端是否必须传递此参数,默认是必须传,否则报400异常
                        defaultValue="1":当为false时非必须传递时,可以设置默认值;)

        eg: !!当前端发送:/param/data1?account=root&page=1;
            要求:account必须传递,page可以不传递,如果不传递默认值就是1
     */
    @RequestMapping("/data1")
    @ResponseBody
    public String data1(@RequestParam(value = "account") String name, //value:指定参数名,请求参数必须传account!!!!
                        @RequestParam(required = false,defaultValue = "1") int page){
        //required=false(代表不是必须传递)和defaultValue(代表默认值)一定是一块出现的

        System.out.println("name = " + name + ", page = " + page);
        return "name = " + name + ", page = " + page;
    }

    /*
    3.一名多值:(集合接值)
        如何接收参数:直接在方法形参处:使用“集合”进行接收;
      eg:!!当前端传来: /param/data2/hobby=唱& hobby=跳&hobby=rap
         注意:在形参处:必须加上@RequestParam!!!!!!!!!
     */
    @RequestMapping("/data2")
    @ResponseBody
    public String data2(@RequestParam List<String> hbs){
        System.out.println("hbs = " + hbs);
        return "ok";
    }

    /*
    4.!!!!!!!使用实体对象接值:
       eg:前端传:/param/data3?name=二狗子&age=18
     如何接收参数:准备一个有对应的属性、get/set方法的实体类即可; 然后在handler方法形参中传入实体类对象即可;
     注意:实体类的属性名一定要等于前端传入的参数名!!!
     */

    @RequestMapping("/data3")
    @ResponseBody
    public  String data3(User user){
        System.out.println("user = " + user);
        return user.toString();
    }


}

3.路径参数接收:

  eg:原来:/user/login?account=root&password=123456
      路径传参:/user/login/root/123456:这个root和"123456"本身已经是参数了;

 实现步骤:
      1.设置动态路径:即使用@RequeatMapping({key1},{key2});
      2.接收动态路径参数 :在方法形参中必须使用@PathVariable注解指定参数
         因为(String username,String password)是用来接收Param格式的参数的!!!!!
         而@PathVariable才是用来接收路径参数的!!!!!!!!;

 路径参数演示:
  eg:  /path/root/密码


 */
@Controller
@RequestMapping("path")
@ResponseBody
public class PathController {

    //handler方法:

    //1.设置动态路径:{key}
    @RequestMapping("{account},{password}")
    public String login(@PathVariable(value = "account") String username, @PathVariable String password){
    //2.路径参数的接收:必须使用:@PathVariable注解在形参来指定接收参数
        System.out.println("username = " + username + ", password = " + password);
        return "username = " + username + ", password = " + password;

        //访问时:/path/root/123
    }

4.json参数接收:

学习目标:
  :在前端发送json格式的请求:我们如何在后端进行接收;

Json格式的数据:前端必须使用 “ Post ”的方式进行请求;
Json是通过体进行发送的
    
 1. Json:是在JS中的一种“ 对象 ”表达方式; 我们使用对应的 “ 实体类 ”进行接收就行了;
 2.在handler方法形参处:使用@Request注解指定参数(因为json是放到请求体中的!!!)
 3.在配置类最上方:加@EnableWebMvc //给handlerAdapter配置json转换器
     
   注意:@EnableWebMvc: 添加HandlerMapping、HandlerAdapter、以及json转换器
         所以加上这个注解之后:我们就不需要在配置类中:写HandlerMapping、HandlerAdapter了!!!!!!!!!
eg:
  /handler
    @PostMapping("data")
    public String data(@RequestBody Person person){
        //因为是Json格式的参数:使用@RequestBody注解 指定参数
        System.out.println("person = " + person);
        return person.toString();

        //最终:我们:在postman:
        //会415异常:因为java原生的api只支持路径参数和param参数;
        //因为json是前端的格式

        /*、
        解决方法:
          1.导入json的依赖
          2.handlerAdapter配置json转换器
             在配置类上加上:@EnableWebMvc (//给handlerAdapter配置json转换器)
         */

    }

5.选择请求方式、设计请求参数、请求路径:

1)
没有请求体: 
   获取:get
   删除:delete
  这两种可以使用: /url +路径参数
                 /url ? +param
                 
              
    
     注意:使用get/delete 时
    
           1.当参数是id标识时:,选择使用路径传递参数!!!
           eg:根据id删除/查询数据:--->: 	/模块/id
            
           2.当参数不是id,是范围参数时:,选择使用param传递参数!!!
            eg: param key=value;
   
(2)  
有请求体:
   保存:post
   修改:put
这两种可以使用:
       /url + 路径参数
       /url ? + param
       请求体传参(json)!!!一般使用json!!!
       
   注意:当使用post时:我们一般使用请求体json!!!!!