在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

SpringBoot 后端接口規(guī)范(上)

jf_78858299 ? 來(lái)源:架構(gòu)師 ? 作者:架構(gòu)師 ? 2023-05-05 17:00 ? 次閱讀

一、前言

一個(gè)后端接口大致分為四個(gè)部分組成: 接口地址(url)、接口請(qǐng)求方式(get、post等)、請(qǐng)求數(shù)據(jù)(request)、響應(yīng)數(shù)據(jù)(response) 。雖然說后端接口的編寫并沒有統(tǒng)一規(guī)范要求,而且如何構(gòu)建這幾個(gè)部分每個(gè)公司要求都不同,沒有什么“一定是最好的”標(biāo)準(zhǔn),但其中最重要的關(guān)鍵點(diǎn)就是看是否規(guī)范。

二、環(huán)境說明

因?yàn)橹v解的重點(diǎn)是后端接口,所以需要導(dǎo)入一個(gè)spring-boot-starter-web包,而lombok作用是簡(jiǎn)化類,前端顯示則使用了knife4j,具體使用在Spring Boot整合knife4j實(shí)現(xiàn)Api文檔已寫明。另外從springboot-2.3開始,校驗(yàn)包被獨(dú)立成了一個(gè)starter組件,所以需要引入如下依賴:



    org.springframework.bootclass="hljs-name"groupId>
    spring-boot-starter-validationclass="hljs-name"artifactId>
class="hljs-name"dependency>


    com.github.xiaoyminclass="hljs-name"groupId>
    knife4j-spring-boot-starterclass="hljs-name"artifactId>
    
    2.0.2class="hljs-name"version>
class="hljs-name"dependency>


    org.springframework.bootclass="hljs-name"groupId>
    spring-boot-starter-webclass="hljs-name"artifactId>
class="hljs-name"dependency>


    org.projectlombokclass="hljs-name"groupId>
    lombokclass="hljs-name"artifactId>
    trueclass="hljs-name"optional>
class="hljs-name"dependency>

三、參數(shù)校驗(yàn)

1、介紹

一個(gè)接口一般對(duì)參數(shù)(請(qǐng)求數(shù)據(jù))都會(huì)進(jìn)行安全校驗(yàn),參數(shù)校驗(yàn)的重要性自然不必多說,那么如何對(duì)參數(shù)進(jìn)行校驗(yàn)就有講究了。一般來(lái)說有三種常見的校驗(yàn)方式,我們使用了最簡(jiǎn)潔的第三種方法

  • 業(yè)務(wù)層校驗(yàn)
  • Validator + BindResult校驗(yàn)
  • Validator + 自動(dòng)拋出異常

業(yè)務(wù)層校驗(yàn)無(wú)需多說,即手動(dòng)在java的Service層進(jìn)行數(shù)據(jù)校驗(yàn)判斷。不過這樣太繁瑣了,光校驗(yàn)代碼就會(huì)有很多

而使用Validator+ BindingResult已經(jīng)是非常方便實(shí)用的參數(shù)校驗(yàn)方式了,在實(shí)際開發(fā)中也有很多項(xiàng)目就是這么做的,不過這樣還是不太方便,因?yàn)槟忝繉懸粋€(gè)接口都要添加一個(gè)BindingResult參數(shù),然后再提取錯(cuò)誤信息返回給前端(簡(jiǎn)單看一下)。

@PostMapping("/addUser")
public String addUser(@RequestBody @Validated User user, BindingResult bindingResult) {
    // 如果有參數(shù)校驗(yàn)失敗,會(huì)將錯(cuò)誤信息封裝成對(duì)象組裝在BindingResult里
    List

2、Validator + 自動(dòng)拋出異常(使用)

內(nèi)置參數(shù)校驗(yàn)如下:

首先Validator可以非常方便的制定校驗(yàn)規(guī)則,并自動(dòng)幫你完成校驗(yàn)。首先在入?yún)⒗镄枰r?yàn)的字段加上注解,每個(gè)注解對(duì)應(yīng)不同的校驗(yàn)規(guī)則,并可制定校驗(yàn)失敗后的信息:

@Data
public class User {
    @NotNull(message = "用戶id不能為空")
    private Long id;

    @NotNull(message = "用戶賬號(hào)不能為空")
    @Size(min = 6, max = 11, message = "賬號(hào)長(zhǎng)度必須是6-11個(gè)字符")
    private String account;

    @NotNull(message = "用戶密碼不能為空")
    @Size(min = 6, max = 11, message = "密碼長(zhǎng)度必須是6-16個(gè)字符")
    private String password;

    @NotNull(message = "用戶郵箱不能為空")
    @Email(message = "郵箱格式不正確")
    private String email;
}

校驗(yàn)規(guī)則和錯(cuò)誤提示信息配置完畢后,接下來(lái)只需要在接口僅需要在校驗(yàn)的參數(shù)上加上@Valid注解(去掉BindingResult后會(huì)自動(dòng)引發(fā)異常,異常發(fā)生了自然而然就不會(huì)執(zhí)行業(yè)務(wù)邏輯):

@RestController
@RequestMapping("user")
public class ValidationController {

    @Autowired
    private ValidationService validationService;

    @PostMapping("/addUser")
    public String addUser(@RequestBody @Validated User user) {

        return validationService.addUser(user);
    }
}

現(xiàn)在我們進(jìn)行測(cè)試,打開knife4j文檔地址,當(dāng)輸入的請(qǐng)求數(shù)據(jù)為空時(shí),Validator會(huì)將所有的報(bào)錯(cuò)信息全部進(jìn)行返回,所以需要與全局異常處理一起使用。

// 使用form data方式調(diào)用接口,校驗(yàn)異常拋出 BindException
// 使用 json 請(qǐng)求體調(diào)用接口,校驗(yàn)異常拋出 MethodArgumentNotValidException
// 單個(gè)參數(shù)校驗(yàn)異常拋出ConstraintViolationException
// 處理 json 請(qǐng)求體調(diào)用接口校驗(yàn)失敗拋出的異常
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResultVO

3、分組校驗(yàn)和遞歸校驗(yàn)

分組校驗(yàn)有三個(gè)步驟:

  • 定義一個(gè)分組類(或接口)
  • 在校驗(yàn)注解上添加groups屬性指定分組
  • Controller方法的@Validated注解添加分組類
public interface Update extends Default{
}
@Data
public class User {
    @NotNull(message = "用戶id不能為空",groups = Update.class)
    private Long id;
  ......
}
@PostMapping("update")
public String update(@Validated({Update.class}) User user) {
    return "success";
}

如果Update不繼承Default,@Validated({Update.class})就只會(huì)校驗(yàn)屬于Update.class分組的參數(shù)字段;如果繼承了,會(huì)校驗(yàn)了其他默認(rèn)屬于Default.class分組的字段。

對(duì)于遞歸校驗(yàn)(比如類中類),只要在相應(yīng)屬性類上增加@Valid注解即可實(shí)現(xiàn)(對(duì)于集合同樣適用)

4、自定義校驗(yàn)

Spring Validation允許用戶自定義校驗(yàn),實(shí)現(xiàn)很簡(jiǎn)單,分兩步:

  • 自定義校驗(yàn)注解
  • 編寫校驗(yàn)者類
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = {HaveNoBlankValidator.class})// 標(biāo)明由哪個(gè)類執(zhí)行校驗(yàn)邏輯
public @interface HaveNoBlank {

    // 校驗(yàn)出錯(cuò)時(shí)默認(rèn)返回的消息
    String message() default "字符串中不能含有空格";
    Class?[] groups() default { };
    Class? extends Payload[] payload() default { };
    /**
     * 同一個(gè)元素上指定多個(gè)該注解時(shí)使用
     */
    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
    @Retention(RUNTIME)
    @Documented
    public @interface List {
        NotBlank[] value();
    }
}
public class HaveNoBlankValidator implements ConstraintValidator<HaveNoBlank, String> {
    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        // null 不做檢驗(yàn)
        if (value == null) {
            return true;
        }
        // 校驗(yàn)失敗
        return !value.contains(" ");
        // 校驗(yàn)成功
    }
}

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7246

    瀏覽量

    91145
  • URL
    URL
    +關(guān)注

    關(guān)注

    0

    文章

    139

    瀏覽量

    15796
  • 后端
    +關(guān)注

    關(guān)注

    0

    文章

    32

    瀏覽量

    2372
  • SpringBoot
    +關(guān)注

    關(guān)注

    0

    文章

    175

    瀏覽量

    324
收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    SpringBoot中的Druid介紹

    SpringBoot中Druid數(shù)據(jù)源配置
    發(fā)表于 05-07 09:21

    SpringBoot知識(shí)總結(jié)

    SpringBoot干貨學(xué)習(xí)總結(jié)
    發(fā)表于 08-01 10:40

    怎么學(xué)習(xí)SpringBoot

    SpringBoot學(xué)習(xí)之路(X5)- 整合JPA
    發(fā)表于 06-10 14:52

    怎樣去使用springboot

    怎樣去使用springboot呢?學(xué)習(xí)springboot需要懂得哪些?
    發(fā)表于 10-25 07:13

    SpringBoot應(yīng)用啟動(dòng)運(yùn)行run方法

    什么時(shí)候創(chuàng)建嵌入式的Servlet容器工廠?什么時(shí)候獲取嵌入式的Servlet容器并啟動(dòng)Tomcat;獲取嵌入式的Servlet容器工廠:1)、SpringBoot應(yīng)用啟動(dòng)運(yùn)行run方法2
    發(fā)表于 12-20 06:16

    基于DSP控制的電力線通信模擬前端接口設(shè)計(jì)

    基于DSP控制的電力線通信模擬前端接口設(shè)計(jì)
    發(fā)表于 10-20 15:51 ?5次下載
    基于DSP控制的電力線通信模擬前<b class='flag-5'>端接口</b>設(shè)計(jì)

    數(shù)字接口—單端接口與差動(dòng)接口的對(duì)比

    數(shù)字接口—單端接口與差動(dòng)接口的對(duì)比
    發(fā)表于 11-07 08:07 ?0次下載
    數(shù)字<b class='flag-5'>接口</b>—單<b class='flag-5'>端接口</b>與差動(dòng)<b class='flag-5'>接口</b>的對(duì)比

    什么是 SpringBoot

    本文從為什么要有 `SpringBoot`,以及 `SpringBoot` 到底方便在哪里開始入手,逐步分析了 `SpringBoot` 自動(dòng)裝配的原理,最后手寫了一個(gè)簡(jiǎn)單的 `start` 組件,通過實(shí)戰(zhàn)來(lái)體會(huì)了 `
    的頭像 發(fā)表于 04-07 11:28 ?1675次閱讀
    什么是 <b class='flag-5'>SpringBoot</b>?

    SpringBoot的核心注解1

    今天跟大家來(lái)探討下SpringBoot的核心注解@SpringBootApplication以及run方法,理解下springBoot為什么不需要XML,達(dá)到零配置
    的頭像 發(fā)表于 04-07 14:34 ?911次閱讀
    <b class='flag-5'>SpringBoot</b>的核心注解1

    SpringBoot的核心注解2

    今天跟大家來(lái)探討下SpringBoot的核心注解@SpringBootApplication以及run方法,理解下springBoot為什么不需要XML,達(dá)到零配置
    的頭像 發(fā)表于 04-07 14:34 ?2172次閱讀
    <b class='flag-5'>SpringBoot</b>的核心注解2

    SpringBoot 后端接口規(guī)范(中)

    一個(gè)后端接口大致分為四個(gè)部分組成: 接口地址(url)、接口請(qǐng)求方式(get、post等)、請(qǐng)求數(shù)據(jù)(request)、響應(yīng)數(shù)據(jù)(response) 。雖然說后端接口的編寫并沒有統(tǒng)一
    的頭像 發(fā)表于 05-05 17:01 ?832次閱讀
    <b class='flag-5'>SpringBoot</b> <b class='flag-5'>后端接口</b><b class='flag-5'>規(guī)范</b>(中)

    SpringBoot 后端接口規(guī)范(下)

    一個(gè)后端接口大致分為四個(gè)部分組成:接口地址(url)、接口請(qǐng)求方式(get、post等)、請(qǐng)求數(shù)據(jù)(request)、響應(yīng)數(shù)據(jù)(response)。雖然說后端接口的編寫并沒有統(tǒng)一
    的頭像 發(fā)表于 05-05 17:02 ?853次閱讀

    后端分離必備的接口規(guī)范

    隨著互聯(lián)網(wǎng)的高速發(fā)展,前端頁(yè)面的展示、交互體驗(yàn)越來(lái)越靈活、炫麗,響應(yīng)體驗(yàn)也要求越來(lái)越高,后端服務(wù)的高并發(fā)、高可用、高性能、高擴(kuò)展等特性的要求也愈加苛刻,從而導(dǎo)致前后端研發(fā)各自專注于自己擅長(zhǎng)的領(lǐng)域深耕細(xì)作。
    的頭像 發(fā)表于 05-15 17:16 ?1096次閱讀
    前<b class='flag-5'>后端</b>分離必備的<b class='flag-5'>接口</b><b class='flag-5'>規(guī)范</b>

    springboot后端交互流程

    Boot 進(jìn)行開發(fā)時(shí),前后端交互是一個(gè)非常重要的部分,本文將詳細(xì)介紹 Spring Boot 前后端交互的流程。 前后端交互的基本原理 在前后端交互的過程中,前端負(fù)責(zé)向
    的頭像 發(fā)表于 11-22 16:00 ?3040次閱讀

    一個(gè)注解搞定SpringBoot接口防刷

    技術(shù)要點(diǎn):springboot的基本知識(shí),redis基本操作,
    的頭像 發(fā)表于 11-28 10:46 ?553次閱讀
    主站蜘蛛池模板: 国产高清成人 | 欧美精品综合一区二区三区 | 另类免费视频 | 天天噜噜噜 | 免费在线看视频 | 四虎色影院 | 亚洲欧美人成网站综合在线 | 高清人人天天夜夜曰狠狠狠狠 | 4438x亚洲最大 | 欧美一级特黄啪啪片免费看 | 四虎影院观看视频在线观看 | 在线成人免费 | 天天爽天天 | www.九色.com | 狠狠色丁香婷婷综合欧美 | 色婷婷色丁香 | 中文字幕视频一区 | 国产午夜精品不卡片 | 天天视频国产精品 | 亚洲va中文字幕 | 三级在线观看网站 | 老色批在线播放视频网站免费 | 国产三级高清 | 国产色婷婷精品综合在线手机播放 | 欧美特级午夜一区二区三区 | 污污视频在线免费看 | 在线www天堂资源网 在线播放 你懂的 | 美女久久久久久 | 激情六月天 | 国产美女免费观看 | 激情视频综合网 | 亚洲性视频网站 | 色视频免费版高清在线观看 | 婷婷丁香视频 | 四虎影院欧美 | 国产自产视频在线观看香蕉 | 色婷婷综合久久久中文字幕 | 欧美一区二区三区影院 | 成人午夜网址 | 欧美一区二区视频在线观看 | 天天射天天干天天舔 |