【06】SpringBoot与Web开发

news2024/11/16 17:28:25

1、基于Restful风格的接口

@RestController
@RequestMapping("/demo")
public class DemoController {

    @GetMapping("/hello")
    public String getHello(){
        return "SpringBoot HelloWorld! 123";
    }

    @GetMapping("/{id}")
    public User getUser(@PathVariable Integer id){
        Map<Integer, User> userMap = new HashMap<>();
        userMap.put(1,new User("张一"));
        userMap.put(2,new User("张二"));
        userMap.put(3,new User("张三"));
        return userMap.get(id);
    }

    @PostMapping("/add")
    public Map<String,Object> addUser(@RequestBody User user) {
        Map<String, Object> map = new HashMap<>();
        map.put("code", 200);
        map.put("msg", "添加成功");
        System.out.println(user);
        return map;
    }

    @PutMapping("/update")
    public Map<String,Object> updateUser(@RequestBody User user) {
        Map<String, Object> map = new HashMap<>();
        map.put("code", 200);
        map.put("msg", "修改成功");
        System.out.println(user);
        return map;
    }

    @DeleteMapping("/delete/{id}")
    public Map<String,Object> deleteUser(@PathVariable Integer id) {
        Map<String, Object> map = new HashMap<>();
        map.put("code", 200);
        map.put("msg", "删除成功");
        System.out.println(id);
        return map;
    }

2、使用RestTemplate请求接口

  • RestTemplate是Spring提供的,用于访问Rest服务的,提供了许多便捷访问远程Http服务的方法。
  • 传统情况下在Java代码里访问restful服务,一般使用Apache的HttpClient。由于此种方法使用起来太过繁琐,所以,Spring提供了一种简单、便捷的模板类来进行操作,它就是RestTemplate
@RestController
@RequestMapping("/rest")
public class RestTemController {

    private RestTemplate restTemplate;

    //当bean没有无参构造函数时,Spring将自动拿到有参的构造函数,参数进行自动注入
    public RestTemController(RestTemplateBuilder restTemplateBuilder) {
        this.restTemplate = restTemplateBuilder.build();
    }

    /**
     * 使用RestTemplate发送请求,查询数据
     * @return
     */
    @RequestMapping("/testRestQuery")
    public String testRestTemplate1() {
        Integer id = 1;
        User user = restTemplate.getForObject("http://localhost:8091/springboot_dev/demo/{id}", User.class,id);
        //另一种get请求的方法
        //restTemplate.getForEntity()
        if (user != null) {
            return user.toString();
        }
        return "用户不存在";
    }

    /**
     * 使用RestTemplate发送请求,获取数据
     * @return
     */
    @RequestMapping("/testRestAdd")
    public String testRestTemplate2() {

        User user = new User("张三", 20, new Date(),"北京市海淀区", Arrays.asList("打球", "跑步", "钓鱼"), new HashMap<String, Object>() {{
            put("朋友1", "小明");
            put("朋友2", "小花");
            put("朋友3", "小张");
        }});

        //url:需要请求的远程url
        //Object :请求需要发送的数据
        //Class<T> :请求返回的数据类型
        //....Object:请求url中需要替换的占位符
        ResponseEntity<Map> responseEntity = restTemplate.postForEntity("http://localhost:8091/springboot_dev/demo/add", user, Map.class);
        return Objects.requireNonNull(responseEntity.getBody()).toString();
    }

    /**
     * 使用RestTemplate发送请求,修改数据
     * @return
     */
    @RequestMapping("/testRestUpdate")
    public String testRestTemplate3() {
        User user = new User("张四", 20, new Date(),"西安市海淀区", Arrays.asList("打球", "跑步", "钓鱼"), new HashMap<String, Object>() {{
            put("朋友1", "小明");
            put("朋友2", "小花");
            put("朋友3", "小张");
        }});
        restTemplate.put("http://localhost:8091/springboot_dev/demo/update", user);
        return "成功修改";
    }


    /**
     * 使用RestTemplate发送请求,修改数据(运用exchange,支持任何请求方法类型)
     * @return
     */
    @RequestMapping("/testRestUpdate2")
    public String testRestTemplate4() {
        User user = new User("张四", 20, new Date(),"西安市海淀区", Arrays.asList("打球", "跑步", "钓鱼"), new HashMap<String, Object>() {{
            put("朋友1", "小明");
            put("朋友2", "小花");
            put("朋友3", "小张");
        }});

        //请求参数封装
        HttpEntity<User> httpEntity = new HttpEntity<>(user);
        //发送请求同时获取请求响应
        ResponseEntity<Map> response = restTemplate.exchange("http://localhost:8091/springboot_dev/demo/update", HttpMethod.PUT, httpEntity, Map.class);
        return Objects.requireNonNull(response.getBody()).toString();
    }

    /**
     * 使用RestTemplate发送请求,删除数据(运用exchange)
     * @return
     */
    @RequestMapping("/testRestDelete")
    public String testRestTemplate5() {
        Integer id = 1;
        //发送请求同时获取请求响应
        ResponseEntity<Map> response = restTemplate.exchange("http://localhost:8091/springboot_dev/demo//delete/{id}", HttpMethod.DELETE, null, Map.class,id);
        return Objects.requireNonNull(response.getBody()).toString();
    }
}

3、使用Swagger调用接口

  • Swagger是一个用于生成、描述和调用 RESTful 接口的 Web 服务。通俗的来讲,Swagger 就是将项目中所有(想要暴露的)接口展现在页面上,并且可以进行接口调用和测试的服务。
  • 有以下 3 个重要的作用:
    • 将项目中所有的接口展现在页面上,这样后端就不需要专门为前端编写专门的接口文档;
    • 当接口更新之后,只需要修改代码中的 Swagger 描述就可以实时生成新的接口文档了,从而规避了接口文档老旧不能使用的问题;
    • 通过 Swagger 页面,我们可以直接进行接口调用,降低了项目开发阶段的调试成本。

1、原生Swagger

  • 引入swagger的依赖
	<!--swagger2的依赖:swagger是一系列对REST接口的描述和UI展示的规范-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.2</version>
        </dependency>
  • 编写配置类
@Configuration
@EnableSwagger2
public class SwaggerConfig {
    /*
     *用来告诉springfox怎么去生成swagger所需要的规范数据
     */
    @Bean
    public Docket createRestApi(){
        return new Docket(DocumentationType.SWAGGER_2) //生成swagger2规范的文档
                .useDefaultResponseMessages(false)
                .pathMapping("/") //设置哪些接口的路径会映射到swagger文档上
                .apiInfo(apiInfo()) //设置文档主体信息
                .select() //接口选择器
                .apis(RequestHandlerSelectors.basePackage("com.trs.controller"))
                .paths(PathSelectors.any())
                .build();
    }

    /**
     * 自定义文档主体信息
     * @return
     */
    private ApiInfo apiInfo() {
       return new ApiInfoBuilder()
                .title("SpringBoot整合Swagger")
                .description("SpringBoot整合Swagger的过程")
                .version("1.0")
                .contact(new Contact("开发者","www.baodu.com","12345@qq.com"))
                .build();
    }
}
  • 访问地址http://localhost:8091//springboot_dev/swagger-ui.html
    原生swagger

2、Knife4j

  • knife4j是Swagger2的增强版,更加友好的操作页面,更多强大的功能,基于Swagger2和 OpenAPI,提供了一个更好的接口文档界面。
  • 引入依赖
 		<dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>knife4j-spring-boot-starter</artifactId>
            <version>2.0.9</version>
        </dependency>
  • 定义配置类
@Configuration
@EnableSwagger2WebMvc
public class SwaggerConfig {
  
    @Bean
    public Docket createRestApi(){
        return new Docket(DocumentationType.SWAGGER_2) //生成swagger2规范的文档
                .useDefaultResponseMessages(false)
                .pathMapping("/") //设置哪些接口的路径会映射到swagger文档上
                .apiInfo(apiInfo()) //设置文档主体信息
                .select() //接口选择器
                .apis(RequestHandlerSelectors.basePackage("com.trs.controller"))
                .paths(PathSelectors.any())
                //描述文档的主体信息
                .build();
    }

    /**
     * 自定义文档主体信息
     * @return
     */
    private ApiInfo apiInfo() {
       return new ApiInfoBuilder()
                .title("SpringBoot整合Swagger")
                .description("SpringBoot整合Swagger的过程")
                .version("1.0")
                .contact(new Contact("开发者","www.baodu.com","12345@qq.com"))
                .build();
    }
}
  • 访问地址http://localhost:8091//springboot_dev/doc.html
    Knife4j

3、相关注解

1、@Api

  • 作用:修饰类,一般修饰的是Controller类,标识这个类是swagger的资源。
  • 相关属性
    • tags:类的说明,如果有多个值,会生成多个List;
    • value:类的说明,可以使用tags来替代;
    @RestController
    @RequestMapping("/signal")
    @Api(tags = {"信号API"},value = "信号API")
    public class SignalController {}
    

2、 @ApiOperation

  • 作用:修饰Controller类中的方法,用于说明一个http请求的操作。
  • 相关属性
    • value:方法的说明;
    • notes:提示内容;
    • tags:可替代value;

3、@ApiParam

  • 作用:修饰Controller类中方法的参数,用于设置参数说明
  • 相关属性
    • name:参数名;

    • value:参数说明;

    • required:是否必填,默认为false;

      @RestController
      @RequestMapping("/user")
      @Api(tags = {"用户API"},value = "用户API")
      public class UserController {
          
          @GetMapping("/getUserInfo")
          @ApiOperation(value="获取用户信息",tags={"获取用户信息"},notes="注意参数必须一致")
          public User getUserInfo(
              @ApiParam(name="userId",value="用户Id",required=true)
              Long userId,
              @ApiParam(name="userName",value="用户名称",required=false)
              String userName){
              User user = userService.getUserInfo();
              return user;
          }
      }
      

4、@Apilgnore

  • 作用:修饰类、方法、参数等等,表示不显示在swagger的文档中。

5、@ApilmplicitParam

  • 作用:用于对方法中的单个参数进行说明;
  • 相关属性
    • name:参数名;
    • value:参数说明;
    • dataType:数据类型;
    • paramType:参数类型;
    • required:是否必须传值;
    • example:举例说明;
    @ApiOperation("查询用户列表")
    @GetMapping("/select")
    @ApiImplicitParam(name = "name",value = "用户名",dataType="String",paramType = "query",required = true,example = "张三")
    public void queryList(String name){}
    

6、@ApiImplicitParams

  • 作用:用于对方法中的多个参数进行说明,包含了多个@ApiImplicitParam。
    @ApiOperation("查询用户列表")
        @GetMapping("/select")
        @ApiImplicitParams({
                @ApiImplicitParam(name="name",value="用户名",dataType="string", paramType = "query",example="xingguo"),
                @ApiImplicitParam(name="id",value="用户id",dataType="long", paramType = "query")
        })
        public void queryList(Long id, String name){}
    

7、@ApiResponses 与 @ApiResponse

  • 作用:对响应结果进行说明;
     @GetMapping("/getAiResult")
     @ApiOperation("信息软删除")
     @ApiResponses({ @ApiResponse(code = 200, message = "操作成功"),
                @ApiResponse(code = 500, message = "服务器内部异常"),
                @ApiResponse(code = 405, message = "权限不足") })
        public RtnResult remove(Long id) {}
    

8、@ApiModel

  • 作用:修饰对象类,并对对象类进行说明,用于Model实体类接收参数的场景。
  • 相关属性
    • value:设置对象名称;
    • description:对对象类进行具体描述;

9、@ApiModelProperty

  • 作用:修饰对象类中的属性,并对属性进行说明;
  • 相关属性
    • value:字段说明;
    • name:字段名称;
    • dataType:数据类型;
    • required:是否必填,默认false;
    • example:举例说明;
    • hidden:是否隐藏;
@ApiModel(value = "司法信号实体",description="司法信号对象")
public class JusticeSiganlModel implements Serializable {
    @ApiModelProperty(name = "eid",value ="企业Id",example = "qa64b0ed4b4093")
    private String eid;
    @ApiModelProperty(name = "entName",value = "企业名称",required = "true",hidden="true")
    private String entName;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1884853.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux 控制台非常好用的 PS1 设置

直接上代码 IP$(/sbin/ifconfig eth0 | awk /inet / {print $2}) export PS1"\[\e[35m\]^o^\[\e[0m\]$ \[\e[31m\]\t\[\e[0m\] [\[\e[36m\]\w\[\e[0m\]] \[\e[32m\]\u\[\e[0m\]\[\e[33m\]\[\e[0m\]\[\e[34m\]\h(\[\e[31m\]$IP\[\e[m\])\[\e[0m\]\n\[\e[35m\].O.\[\e[0m\]…

仿美团饿了么程序,外卖人9.0商业版外卖订餐源码(PC+微信)

仿美团饿了么程序,外卖人9.0外卖订餐源码,PC微信WAP短信宝,多城市多色版 非常不错的独立版外卖跑腿网站源码&#xff0c;喜欢的可以下载调试看看吧&#xff01;&#xff01; 仿美团饿了么程序,外卖人9.0外卖订餐源码

【论文阅读】自动驾驶光流任务 DeFlow: Decoder of Scene Flow Network in Autonomous Driving

再一次轮到讲自己的paper&#xff01;耶&#xff0c;宣传一下自己的工作&#xff0c;顺便完成中文博客的解读 方便大家讨论。 Title Picture Reference and pictures paper: https://arxiv.org/abs/2401.16122 code: https://github.com/KTH-RPL/DeFlow b站视频: https://www.b…

Git 命令学习之推送本地项目到 Gitee 托管

引言 在软件开发中&#xff0c;版本控制是不可或缺的一环。Git 作为目前最流行的分布式版本控制系统&#xff0c;广泛应用于各种项目中。而 Gitee&#xff08;原名码云&#xff09;作为国内知名的代码托管平台&#xff0c;为开发者提供了稳定、安全的代码托管服务。下面将详细…

C++的IO流操作

文章目录 C语言的输入与输出流是什么CIO流C标准IO流C文件IO流二进制读写文本读写 stringstream的简单介绍 C语言的输入与输出 C语言的输入与输出 C语言中我们用到的最频繁的输入输出方式就是scanf()与printf()。 scanf(): 从标准输入设备(键盘)读取数据&#xff0c;并将值存放…

【单片机毕业设计选题24042】-基于无线传输的老人健康监护系统

系统功能: 系统操作说明&#xff1a; 上电后OLED显示 “欢迎使用健康监护系统请稍后”&#xff0c;两秒后显示Connecting...表示 正在连接阿里云&#xff0c;正常连接阿里云后显示第一页面&#xff0c;如长时间显示Connecting...请 检查WiFi网络是否正确。 第一页面第一行…

基于苹果CMS系统的双端视频播放APP源码

基于苹果CMS系统的双端视频播放APP源码。一款基于苹果CMS系统的移动端在线视频播放软件&#xff0c;支持mp4、flv、m3u8、rmvb、mkv等主流视频格式的播放&#xff0c;现有安卓ios版本 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/89471018 更多资源…

爬虫逆向实战(42)-某巢登陆(AES、MD5、RSA、滑块验证码)

一、数据接口分析 主页地址&#xff1a;某巢 1、抓包 通过抓包可以发现在登录时&#xff0c;网站首先请求captcha/querySlideImage/来获取滑块验证码的图片&#xff0c;然后请求captcha/checkCode/接口来验证滑块验证码。滑块验证码校验成功后&#xff0c;请求noshiro/getPu…

windows10如何打开开发者模式

按键盘上的win键或者点击屏幕左下角的开始图标&#xff0c;即可出现如下的界面 在打开的界面中找到设置按钮&#xff0c;点击设置按钮 进入windows设置界面后&#xff0c;找到‘更新和安全’的选项&#xff0c;随后点击进入 进去后在左侧的功能列表中找到‘开发者选…

8N10 惠海 100V 8A HG160N10L TO-252封装 打火机-加湿器N沟道MOS管

MOS管是金属-氧化物-半导体场效应晶体管&#xff0c;或者称为金属-绝缘体-半导体。MOS管的工作原理主要是利用加在栅极&#xff08;G&#xff09;上的电压&#xff08;VGS&#xff09;来控制“感应电荷”的多少&#xff0c;从而改变由这些“感应电荷”形成的导电沟道的状况&…

安捷伦B2902A精密电源/测量单元KEYSIGHT是德B2902A数字源表

Agilent B2902A、Keysight B2902A、HP B2902A 精密电源/测量单元&#xff0c;2 通道&#xff0c;100 fA&#xff0c;210 V&#xff0c;3 A 直流/10.5 A 脉冲 Agilent B2902A 精密源/测量单元 (SMU) 是一款 2 通道、紧凑且经济高效的台式 SMU&#xff0c;能够提供和测量电压和电…

基于Java中的SSM框架实现大学生就业预测系统项目【项目源码+论文说明】计算机毕业设计

基于Java中的SSM框架实现大学生就业预测系统演示 摘要 科技不断飞速发展&#xff0c;人类文明走向一个又一个的高峰。在科技进步的浪潮中&#xff0c;计算机技术得到了巨大的发展&#xff0c;随着技术的完善&#xff0c;生产成本的降低&#xff0c;计算机走进千家万户。计算机…

录屏软件哪个好用?分享5款(2024最新)

随着网络时代的发展&#xff0c;电脑的使用频率也越来越高&#xff0c;还有近些年出现的网课、直播等&#xff0c;这让电脑的录屏功能显得更重要。随之而来的录屏软件也越来越多样化&#xff0c;选择一款好的软件是录屏至关重要的环节。 在数字浪潮汹涌的时代&#xff0c;录屏…

【Tech Point】

ARM加速LLama C 加速对象 LLama C 加速对象 LLama C 关键技术&#xff1a; 使用neon加速指令进行SIMD操作&#xff1b;优化数据排布&#xff0c;降低数据读取的中断

挑战与成长:面对他人成就引发的焦虑与迷茫

挑战与成长&#xff1a;面对他人成就引发的焦虑与迷茫 对于追求知识和技能的人来说&#xff0c;看到他人做出自己尚未达到的成就确实会带来焦虑感。这种焦虑常常源于对自己能力的质疑和对未来的不确定性。 在我的学习和发展过程中&#xff0c;有时确实会看到其他模型或系统能…

mdb转gdb实现过程介绍(1)mdb地理数据库结构解析和gdb库的创建

内容提示&#xff1a; mdb数据转出为gdb&#xff0c;应保留原mdb的库体结构。库体结构中&#xff0c;应该正确处理数据集、要素类和表之间的结构。 数据集&#xff1a;保持数据集结构&#xff1b; 要素类&#xff1a;要素类位于mdb根目录或数据集下&#xff1b; 表&#xff1a;…

MySQL InnoDB Cluster 高可用集群部署

MySQL InnoDB Cluster 简介 官方文档&#xff1a;https://dev.mysql.com/doc/refman/8.4/en/mysql-innodb-cluster-introduction.html 本章介绍 MySQL InnoDB Cluster&#xff0c;它结合了 MySQL 技术&#xff0c;使您能够部署和管理完整的 MySQL 集成高可用性解决方案。 说…

Labview绘制柱状图

废话不多说&#xff0c;直接上图 我喜欢用NXG风格&#xff0c;这里我个人选的是xy图。 点击箭头指的地方 选择直方图 插值选择第一个 直方图类型我选的是第二个效果如图。 程序部分如图。 最后吐槽一句&#xff0c;现在看CSDN好多文章都要收费了&#xff0c;哪怕一些简单的入…

运营商如何通过PCDN技术提高用户服务?

着互联网的快速发展&#xff0c;用户对网络速度和质量的要求越来越高。为了满足这些需求&#xff0c;内容分发网络(CDN)成为了关键的基础设施。而在CDN技术中&#xff0c;PCDN(PersonalCDN)作为一种新兴的技术&#xff0c;为运营商和用户提供了新的解决方案。本文将重点介绍PCD…

vue3中使用Antv G6渲染树形结构并支持节点增删改

写在前面 在一些管理系统中&#xff0c;会对组织架构、级联数据等做一些管理&#xff0c;你会怎么实现呢&#xff1f;在经过调研很多插件之后决定使用 Antv G6 实现&#xff0c;文档也比较清晰&#xff0c;看看怎么实现吧&#xff0c;先来看看效果图。点击在线体验 实现的功能…