• 11. SpringBoot项目中参数获取与响应


    SpringBoot项目中参数获取与响应

    1. 程序结构&通信方式

    程序结构:

    • C/S : 客户端/服务器端
      -Main方法。
      -效果炫目、数据相对安全。
      -公司成本高,因为要分别开发客户端和服务器端。

    • B/S: 浏览器端/服务器端
      -效果依赖于浏览器、数据相对不如C/S安全(token令牌模式)
      -公司成本低,只需要单独开发服务器端。

    资源信息:

    • 资源:在网上能够访问的一切信息(文字、图片、音乐、视频…)

    • 静态资源:代码不变、效果不变。
      (HTML/CSS/JS/VUE…)

    • 动态资源:效果改变根据代码控制。
      (Java、servlet…)

    通信方式:

    • WEB程序:请求和响应模式。
      -浏览器向服务器发信息: 发请求
      -服务器向浏览器发信息:发响应

    • 请求-响应是成对出现的。
      -先有请求,再有响应。
      -必须是 浏览器先向服务器发请求,服务器收到请求后,才能向浏览器发响应。

    2. 创建和浏览器交互的控制器-controller

    • 包创建:
      01
      02
    • Java程序(Java类)创建:

    新建名为—MyController的class类
    03
    04
    在MyController中输入

    @RestController //标记当前Java类,是一个可以和浏览器进行数据交换的控制器
    @RequestMapping("/my") //给该控制器设置一个访问路径,该路径是可以在浏览器上进行访问的
    public class MyController {
    
       @RequestMapping("/t1")//给该方法设置一个访问路径,该路径是可以在浏览器上进行访问的
       public String t1(){
           System.out.println("helloWorld!!!");//在控制台打印信息
           return "你好世界!!!";//将信息发给浏览器,让浏览器展示
       }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    程序运行的访问路径:http://localhost:8080/my/t1

    问题解释

    1. SpringBoot启动和关闭
      启动:
      05
      关闭:
      任意按下一个小红方块均可关闭SpringBoot项目
      06
      关闭之后,刷新网页,不再出现运行SpringBoot项目时显示的页面
      07

    2. 代码编写的注意事项

    08

    1. 如果更新了代码,怎么办?
      先正常关闭服务器,再重新正常启动服务器,代码执行的就是最新代码了。

    3. 单参数获取

    09

    传统风格:
    http://主机名:端口/资源?参数列表
    例如:http://localhost:8080/my/t1?userName=aa&sex=man&hobbies=code&hobbies=swim
    - 必须传递参数
    @RequestParam("参数名") 参数类型 参数名
    
    • 1
    • 2
    • 3
    • 4
    • 5

    例如:如果忘记传递sex这个参数,浏览器就会报错
    09

    - 非必须传递参数
    @RequestParam(value="参数名",required=false) 参数类型 参数名
    设置为非必须传递参数,如果参数正常传递,可以接收,如果参数未传递,返回为null
    
    • 1
    • 2
    • 3

    例如:

     @RequestMapping("/t2")
       public void t2(
               @RequestParam("userName")String userName,
               @RequestParam("sex")String sex,
               @RequestParam("hobbies")String[] hobbies
       ){
           //http://localhost:8080/my/t2?userName=aa&sex=man&hobbies=code&hobbies=swim
           System.out.println(userName);
           System.out.println(sex);
           System.out.println(Arrays.toString(hobbies));
       }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    @RequestMapping("/t3")
    public void t3(
           @RequestParam("userName")String userName,
           @RequestParam(value="sex",required = false)String sex,
           @RequestParam("hobbies")String[] hobbies
    ){
       //http://localhost:8080/my/t3/userName=aa&sex=man&hobbies=code&hobbies=swim
       //http://localhost:8080/my/t3?userName=aa&hobbies=code&hobbies=swim
       System.out.println(userName);
       System.out.println(sex);
       System.out.println(Arrays.toString(hobbies));
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    RESTFul风格:
    http://主机名:端口/资源/参数列表
    例如:http://localhost:8080/my/t1/aa/man/code,swim
    @PathVariable("参数名") 参数类型 参数名
    @RequestMapping("/资源名/{参数名1}/{参数名2}")
    
    例如:http://localhost:8080/my/t1/aa/man/code,swim
    @RequestMapping("/t1/{userName}/{sex}/{hobbies}")
    @PathVariable("userName") String userName
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    @RequestMapping("/t4/{userName}/{sex}/{hobbies}")
    public void t4(
           @PathVariable("userName") String userName,
           @PathVariable("sex")String sex,
           @PathVariable("hobbies")String[] hobbies
    ){
       //http://localhost:8080/my/t4/aa/man/code,swim
       System.out.println(userName);
       System.out.println(sex);
       System.out.println(Arrays.toString(hobbies));
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    小结: 传统方式:@RequestParam
    	   RESTFul风格:@PathVariable
    
    • 1
    • 2

    4. 多参数获取(JavaBean/Map数据)

    4.1. Swagger2

    postman经典测试工具
    Swagger2集成到项目中,比postman更加方便测试工具。
    
    • 1
    • 2
    • 环境搭建:
      在pom.xml中添加maven环境—再点击更新maven环境010
    	<dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-boot-starter</artifactId>
                <version>3.0.0</version>
    	</dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    添加注解
    011

    • 使用入口:
      8080是端口号
    http://localhost:8080/swagger-ui/index.html
    
    • 1
    • 使用操作:
      012
      POST请求居多,少量的GET请求
    JavaBean:
    进行数据封装:
    属性名 = 属性值;
    userName = 张三;
    hobbies = 编程,游泳;
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    创建TestBean1类

    @Data
    public class TestBean1 {
       private String name;
       private String sex;
       private String[] hobbies;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    @RequestMapping("/t5")
    public void t5(){
       //ctrl+alt+v
       TestBean1 tb1 = new TestBean1();
       tb1.setName("小张");
       tb1.setSex("男");
       String[] hobbies = {"编程","游泳"};
       tb1.setHobbies(hobbies);
       System.out.println(tb1);//查看所有属性值
       System.out.println(tb1.getName());//小张
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    Map:
    创建出来,封装数据。

    @RequestMapping("/t6")
    public void t6(){
       //key:String类型   value:任意类型
       Map<String, Object> map1 = new HashMap<>();
       map1.put("name","小张");
       map1.put("sex","男");
       String[] hobbies = {"编程","游泳"};
       map1.put("hobbies",hobbies);
    
       System.out.println(map1);//查看所有属性值
       System.out.println(map1.get("name"));//小张
       System.out.println(Arrays.toString((Object[]) map1.get("hobbies")));
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    4.2. application/x-www-form-urlencoded格式

    Swagger测试同步会导致复选框用hobbies=a1|a2格式,导致服务器解析失败。	
    
    • 1
    普通数据
    接收请求:直接在controller方法参数列表上写 JavaBean或map
    格式1:(建议)
    public 返回值类型 方法名(JavaBean javaBean){
    
    }
    
    格式2:(不建议)
    public 返回值类型 方法名(Map map){
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    @RequestMapping("/t7")
    public void t7(TestBean1 testBean1){
       //http://localhost:8080/my/t7?name=%E5%B0%8F%E5%BC%A0&sex=man&hobbies=code&hobbies=swim
       System.out.println(testBean1);
       System.out.println(testBean1.getName());
    }
    @RequestMapping("/t8")
    public void t8(Map<String,Object> map){
       //http://localhost:8080/my/t8?name=%E5%B0%8F%E5%BC%A0&sex=man&hobbies=code&hobbies=swim
       System.out.println(map);//{}
       System.out.println(map.get("name"));//null
       System.out.println(Arrays.toString((Object[]) map.get("hobbies")));//null
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    4.3. application/json格式

    • json数据接收请求:
      013
    @RequestBody JavaBean javaBean
    @RequestBody Map map
    
    • 1
    • 2
    @RequestMapping("/t9")
    public void t9(@RequestBody TestBean1 testBean1){
       System.out.println(testBean1);
       System.out.println(testBean1.getName());
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    @RequestMapping("/t10")
    public void t10(@RequestBody Map<String,Object> map){
       System.out.println(map);//{hobbies=[游泳, 编程], name=小张, sex=男}
       System.out.println(map.get("name"));//小张
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    小结:如果接收json请求数据,若只是接收并使用一次,用map.
         如果多个方法中都有接收和使用,用JavaBean
    
    • 1
    • 2
    • json数据发送响应
    @ResponseBody JavaBean
    @ResponseBody Map
    
    • 1
    • 2
    @RequestMapping("/t11")
    public @ResponseBody TestBean1 t11(){
       TestBean1 tb1 = new TestBean1();
       tb1.setName("小张");
       tb1.setSex("男");
       String[] hobbies = {"编程","游泳"};
       tb1.setHobbies(hobbies);
       return tb1;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    @RequestMapping("/t12")
    public @ResponseBody Map<String, Object> t12(){
       Map<String, Object> map1 = new HashMap<>();
       map1.put("name","小张");
       map1.put("sex","男");
       String[] hobbies = {"编程","游泳"};
       map1.put("hobbies",hobbies);
       return map1;
       }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    小结:如果发送json响应数据,若只是响应并使用一次,用map.
         如果多个方法中都有响应和使用,用JavaBean
    
    • 1
    • 2
  • 相关阅读:
    Android PackageManager的妙用
    Coroutine--协程笔记
    接上一篇:分布式调用链追踪系统设计
    功率放大器的作用和工作原理是什么
    ScienceQA
    [SpringBoot系列]SSMP整合小项目
    电车仪表/泵表等 64*8点 LCD液晶段码屏显示驱动IC-VK1625 具省电模式,可兼容替代市面1625,FAE技术支持
    Zookeeper 命令使用和数据说明
    基于python的大数据反电信诈骗管理系统设计与实现
    msvc编译器编码错误解决方案
  • 原文地址:https://blog.csdn.net/m0_58503202/article/details/133800846