【06】SpringBoot与Web开发

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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【支撑文档】系统安全保证措施(word原件)

软件安全保证措施word 软件所有全套资料获取进主页或者本文末个人名片直接。

图形的搭建

例一&#xff1a; 输入描述&#xff1a; 多组输入&#xff0c;一个整数&#xff08;2~20&#xff09;&#xff0c;表示输出的行数&#xff0c;也表示组成“X”的反斜线和正斜线的长度。 输出描述&#xff1a; 针对每行输入&#xff0c;输出用“*”组成的X形图案。 示例一&…

【C语言】19.预处理详解

文章目录 1.预定义符号2.#define定义常量3.#define定义宏4.带有副作用的宏参数5.宏替换的规则6.宏函数的对比7.#和##7.1 #运算符7.2 ## 运算符 8.命名约定9.#undef10.命令行定义11.条件编译12.头文件的包含12.1 头⽂件被包含的⽅式12.1.1 本地⽂件包含12.1.2 库⽂件包含 12.2 嵌…

基于协同过滤的航空票务推荐系统的设计与实现(飞机票推荐系统)

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

鸿蒙OS开发者高级学习第2课:自由流转(含习题答案)

自由流转两种形态&#xff1a;相继使用&#xff08;跨端迁移&#xff09;&#xff1b;同时使用&#xff08; 多端协同&#xff09; 习题&#xff1a;

【云原生】服务网格(Istio)如何简化微服务通信

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《未来已来&#xff1a;云原生之旅》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、微服务架构的兴起 2、Istio&#xff1a;服务网格的佼…

《昇思25天学习打卡营第27天 | 昇思MindSporeShuffleNet图像分类》

27天 本节学习了ShuffleNet图像分类 ShuffleNetV1是旷视科技提出的一种计算高效的CNN模型&#xff0c;和MobileNet, SqueezeNet等一样主要应用在移动端&#xff0c;模型的设计目标就是利用有限的计算资源来达到最好的模型精度。设计核心是引入了两种操作&#xff1a;Pointwis…

Fanuc DPRNT宏程序串口采集

此种方式可用于设备没有网口的情形 该方式的核心原理是利用设备串口的输出能力&#xff0c;进行串口输出。但这里有一点需要注意&#xff0c;这种方式串口输出不具备实时性。因为串口输出是设备主动输出&#xff0c;采集程序只是被动接收而已&#xff0c;所以没有办法做到实时…

网络爬虫(二) 哔哩哔哩热榜高频词按照图片形状排列

我们有时候需要爬取结果生成为自定义的词云图 生成自定义的词云图通常需要以下步骤&#xff1a; 1. 爬取数据&#xff1a;使用爬虫工具或库&#xff0c;如requests、BeautifulSoup等&#xff0c;可以爬取网页、论坛、社交媒体等平台上的文本数据。 2. 数据预处理&#xff1a…

自动驾驶---Motion Planning之多段五次多项式

1 前言 在之前的博客系列文章中和读者朋友们聊过Apollo的 Motion Planning方案: 《自动驾驶---Motion Planning之LaneChange》 《自动驾驶---Motion Planning之Path Boundary》 《自动驾驶---Motion Planning之Speed Boundary》 《自动驾驶---Motion Planning之轨迹Path优化》…

20240701在飞凌的OK3588-C开发板的Android12系统下使用i2cdetect确认I2C总线

console:/ # i2cdetect -y -r 0 console:/ # i2cdetect -l console:/ # i2cdetect -F 0 20240701在飞凌的OK3588-C开发板的Android12系统下使用i2cdetect确认I2C总线 2024/7/1 11:30 在CAM1、CAM2挂载OV13850。 在CAM3、CAM4和CAM5挂载OV5645了。 console:/ # i2 i2cdetect i2…

音乐:触动心灵的艺术语言

Enjoy your music 音 乐 作为一种跨越时空和文化的艺术形式&#xff0c;拥有着无穷的魅力和力量。 它不仅能够带给我们愉悦的听觉享受&#xff0c;还对我们的身心健康、认知发展和社会交往产生着深远的影响。 一、音乐的基本元素 音乐由多个基本元素构成&#xff0c;包括…

【黑龙江等保测评具体是怎样做的?】

实现等保测评一般包括下列步骤&#xff1a; 1.黑龙江等保测评的目标&#xff1a;要明确评价的对象&#xff0c;即评价的范围和重点&#xff0c;以及要达到的层次。这样就可以保证评估工作是根据企业的实际需要来开展的。 2.黑龙江等保测评的现场测评&#xff1a;搜集有关的安…

LabVIEW电压电流实时监测系统

开发了一种基于LabVIEW和研华&#xff08;Advantech&#xff09;数据采集卡的电压电流实时监测系统&#xff0c;通过高效的数据采集和处理&#xff0c;为工业和科研用户提供高精度、实时的电压电流监测解决方案。系统采用研华USB-4711A数据采集卡&#xff0c;结合LabVIEW编程环…

IPIDEA代理IP助力高效数据采集

IPIDEA代理IP助力高效数据采集 文章目录 IPIDEA代理IP助力高效数据采集&#x1f4d1;前言一、爬虫数据采集痛点二、代理IP解决爬虫痛点2.1 为什么可以2.2 选择代理IP的关键因素 三、IPIDEA海外IP代理的优势3.1 IPIDEA的显著优势3.2 IPIDEA的代理类型及应用 四、IPIDEA爬虫实战4…

万界星空科技铜管加工行业MES系统解决方案

一、行业背景与挑战 随着铜管加工行业的快速发展&#xff0c;传统的管理模式已难以满足日益增长的生产需求。为满足市场的高效率、高质量、低成本要求&#xff0c;企业急需一套智能化的管理系统来提升生产效率、优化资源配置和确保产品质量。因此&#xff0c;我们针对铜管加工行…

docker部署前端,配置域名和ssl

之前使用80端口部署前端项目后&#xff0c;可以使用IP端口号在公网访问到部署的项目。 进行ICP域名备案后&#xff0c;可以通过域名解析将IP套壳&#xff0c;访问域名直接访问到部署的项目~ 如果使用http协议可以很容易实现这个需求&#xff0c;对nginx.conf文件进行修改&#…

物联网数据可视化利器:云组态设计器全新升级

数据可视化已成为数据展示与分析领域非常重要的工具。由多种图表、3D图形组成的大屏能够帮助用户非常直观简洁地了解数据。在物联网环境下,用户在制作数据展示大屏时,对数据可视化工具提出了更高的要求,例如能够展示3D组件、灵活的图层结构、支持多种数据源、实时的数据更新、图…

化身李时珍弟子,演绎中医药故事,李良济花神戏,创新传承中医药文化

6月29日&#xff0c;李良济与花神戏联袂举办的儿童剧本&#xff0c;在李良济嵩山店强势开启。 20余名小朋友&#xff0c;一起在这次中医药儿童剧本活动中&#xff0c;化身李时珍弟子&#xff0c;学中医&#xff0c;识草药&#xff0c;传承中医智慧&#xff0c;沉浸式学习传统文…

如何在AWS上使用免费的服务器

要在AWS上免费使用的服务器&#xff0c;你可以按照以下步骤操作&#xff1a; &#xff08;1&#xff09;注册AWS账户&#xff1a; 访问AWS官方网站&#xff08;https://aws.amazon.com/cn/&#xff09;&#xff0c;点击右上角的“完成注册”&#xff0c;按照页面提示填写相关…