精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Spring Boot Rest API十大常見錯誤及避免方法

開發 前端
本篇文章,我們將探討Spring Boot REST API中的十大常見錯誤,解釋它們的影響,并使用最新的Spring Boot特性和最佳實踐提供更新的解決方案。

環境:SpringBoot3.2.5

1. 簡介

構建健壯且高效的REST API是現代應用開發的關鍵。雖然Spring Boot簡化了這一過程,但開發人員經常會犯一些錯誤,這些錯誤可能導致效率低下、安全漏洞或用戶體驗不佳。本篇文章,我們將探討Spring Boot REST API中的十大常見錯誤,解釋它們的影響,并使用最新的Spring Boot特性和最佳實踐提供更新的解決方案。

圖片圖片

接下來,我們將詳細介紹上面10點常見錯誤。

2. 錯誤詳解

2.1 使用錯誤的HTTP狀態碼

  • 錯誤:對所有響應(包括錯誤響應)都返回200 OK狀態碼。
  • 影響:誤導性的狀態碼會使API客戶端感到困惑,并使調試變得困難。
  • 解決方案:根據具體情況始終使用適當的HTTP狀態碼:

a.200 OK:請求成功。

b.201 Created:資源已成功創建。

c.400 Bad Request:輸入無效或存在驗證錯誤。

d.404 Not Found:資源不存在。

e.500 Internal Server Error:服務器內部錯誤(意外錯誤)。 

@RestController
@RequestMapping("/api/products")
public class ProductController {


  @GetMapping("/{id}")
  public ResponseEntity<Product> getProductById(@PathVariable Long id) {
    return productService.findById(id)
      .map(product -> ResponseEntity.ok(product))
      .orElse(ResponseEntity.status(HttpStatus.NOT_FOUND).build()) ;
  }
}

為何重要:正確的HTTP狀態碼可以提高客戶端的理解能力和API的可靠性。

2.2 未驗證輸入數據

  • 錯誤:未經驗證就接受數據。
  • 影響:會導致安全漏洞和后續錯誤。
  • 解決方案:在數據傳輸對象(DTO)上使用@Valid注解進行輸入驗證,并優雅地處理錯誤。
     
@RestController
@RequestMapping("/api/products")
public class ProductController {


  @PostMapping
  public ResponseEntity<String> createProduct(@Valid @RequestBody ProductDTO productDTO) {
    productService.save(productDTO) ;
    return ResponseEntity.status(HttpStatus.CREATED)
      .body("success");
  }
}


public record ProductDTO(
        @NotNull(message = "名稱不能為空") 
        String name,
        @Positive(message = "價格必須大于0") 
        Double price) {}

為何重要:驗證輸入可以確保數據的完整性,并防止濫用。

2.3 忽略API版本控制

  • 錯誤:開發API時不進行版本控制會導致對客戶端的破壞性更改。
  • 影響:當API發展時,客戶端可能會遇到兼容性問題。
  • 解決方案:通過URI或自定義頭部實現API版本控制。
@RestController
@RequestMapping("/api/v1/products")
public class ProductV1Controller {
  @GetMapping("/{id}")
  public Product getProductV1(@PathVariable Long id) {
    return productService.findByIdV1(id);
  }
}


@RestController
@RequestMapping("/api/v2/products")
public class ProductV2Controller {
  @GetMapping("/{id}")
  public ProductDTO getProductV2(@PathVariable Long id) {
    return productService.findByIdV2(id);
  }
}

為何重要:版本控制可以在引入新功能的同時確保向后兼容性。

2.4 對端點和配置進行硬編碼

  • 錯誤:在代碼中硬編碼URL或服務端點。
  • 影響:使應用程序難以維護和配置。
  • 解決方案:使用application.yml或application.properties將配置外部化。

配置文件

# application.yml
pack:
  product:
    service:
      url: https://api.pack.com/products

代碼注入

@Value("${pack.product.service.url}")
private String productServiceUrl;

為何重要:將配置外部化可以使您的應用程序更加靈活且易于維護。

2.5 異常處理不當

  • 錯誤:允許異常未經適當格式化就傳播到客戶端。
  • 影響:客戶端會收到結構不清晰的錯誤信息,導致困惑。
  • 解決方案:使用帶有@ExceptionHandler的@ControllerAdvice進行集中式的錯誤處理。
@RestControllerAdvice
public class GlobalExceptionHandler {


  @ExceptionHandler(ResourceNotFoundException.class)
  public ResponseEntity<String> handleNotFound(ResourceNotFoundException ex) {
    return ResponseEntity.status(HttpStatus.NOT_FOUND)
      .body(ex.getMessage());
  }


  @ExceptionHandler(Exception.class)
  public ResponseEntity<String> handleGenericException(Exception ex) {
    return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
      .body("發生錯誤: " + ex.getMessage());
  }
}

為何重要:適當的異常處理能夠提升客戶體驗和調試效率。

2.6 直接暴露JAP實體對象

  • 錯誤:直接在API響應中暴露數據庫實體。
  • 影響:導致數據庫與API之間緊密耦合。
  • 解決方案:使用DTO(數據傳輸對象)將API響應與數據庫架構解耦。
public record ProductDTO(Long id, String name, Double price) {}


public ProductDTO mapToDTO(Product product) {
  return new ProductDTO(product.getId(), product.getName(), product.getPrice());
}

為何重要:DTO(數據傳輸對象)提高了API的靈活性,并防止敏感數據泄露。

2.7 未實現分頁和過濾功能

  • 錯誤:在單個響應中返回大型數據集。
  • 影響:導致性能瓶頸和客戶端問題。
  • 解決方案:使用Pageable實現分頁和過濾功能。
@GetMapping
public Page<Product> getAllProducts(Pageable pageable) {
  return productRepository.findAll(pageable);
}

為何重要:分頁和過濾功能能夠提高API的性能和可擴展性。

2.8 忽略接口安全

  • 錯誤:未對REST API進行保護或暴露敏感數據。
  • 影響:可能導致未經授權的訪問和潛在的數據泄露。
  • 解決方案:使用帶有JWT或OAuth2的Spring Security。
@Bean
SecurityFilterChain apiSecurityFilterChain(HttpSecurity http) throws Throwable {
  http.csrf(csrf -> csrf.disable()) ;
  http.authorizeHttpRequests(registry -> {
    registry.requestMatchers("/*/*.js", "/*/*.css", "*.css", "*.js", "*.html", "/*/*.html", "/login", "/logout").permitAll() ;
    registry.requestMatchers("/**").authenticated() ;
  }) ;
  http.securityMatcher("/api/**", "/admin/**", "/login", "/logout", "/default-ui.css") ;
  http.addFilterBefore(authFilter(), UsernamePasswordAuthenticationFilter.class) ;
  return http.build() ;
}

以上指定了api接口及其它資源的訪問策略。

為何重要:安全性能夠保護敏感數據并確保合規性。

2.9 忽略API文檔

  • 錯誤:跳過API文檔編寫。
  • 影響:導致其他開發人員難以使用你的API。
  • 解決方案:使用Knife4j進行自動生成的API文檔編寫。

引入依賴

<dependency>
  <groupId>com.github.xiaoymin</groupId>
  <artifactId>knife4j-spring-boot-starter</artifactId>
</dependency>

配置

@Bean
public Docket createRestApi() {
  return new Docket(DocumentationType.OAS_30)
    // 是否啟用Swagger
    .enable(enabled)
    // 用來創建該API的基本信息,展示在文檔的頁面中(自定義展示的信息)
    .apiInfo(apiInfo())
    // 設置哪些接口暴露給Swagger展示
    .select()
    // 掃描所有有注解的api,用這種方式更靈活
    .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
    .paths(PathSelectors.any()).build()
    /* 設置安全模式,swagger可以設置訪問token */
    .securitySchemes(securitySchemes())
    .securityContexts(securityContexts());
}
private ApiInfo apiInfo() {
  // 用ApiInfoBuilder進行定制
  return new ApiInfoBuilder()
    // 設置標題
    .title("Pack_接口文檔")
    // 描述
    .description("Packxxx系統,具體包括XXX,XXX模塊...")
    // 作者信息
    .contact(new Contact("xxxooo", null, null))
    // 版本
    .version("1.0.0").build();
}
private List<SecurityScheme> securitySchemes() {
  List<SecurityScheme> apiKeyList = new ArrayList<SecurityScheme>();
  apiKeyList.add(new ApiKey("Authorization", "Authorization", In.HEADER.toValue()));
  return apiKeyList;
}

為何重要:文檔能夠提高開發者的生產力和協作效率。

2.10 API中忽略HATEOAS

  • 錯誤:返回不帶導航鏈接的純JSON數據。
  • 影響:客戶端缺乏執行相關操作的指導。
  • 解決方案:使用Spring HATEOAS來包含導航鏈接。

引入依賴

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-hateoas</artifactId>
</dependency>

使用

import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo;
import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.methodOn;


@RestController
@RequestMapping("/products")
public class ProductController {


  @GetMapping("/{id}")
  public EntityModel<ProductDTO> queryProductById(@PathVariable Long id) {
    ProductDTO productDTO = new ProductDTO(id, "鼠標", 66.6D) ;
    EntityModel<ProductDTO> productModel = EntityModel.of(
          productDTO,
          linkTo(methodOn(ProductController.class).queryProductById(productDTO.id())).withSelfRel(),
          linkTo(methodOn(ProductController.class).queryProducts()).withRel("all-products")
        ) ;
    return productModel ;
  }
  @GetMapping("")
  public List<EntityModel<ProductDTO>> queryProducts() {
    List<EntityModel<ProductDTO>> list = List.of(
          EntityModel.of(
                new ProductDTO(1L, "鼠標", 66.6),
                linkTo(methodOn(ProductController.class).queryProductById(1L)).withSelfRel(),
                linkTo(methodOn(ProductController.class).queryProducts()).withRel("all-products")
              ),
          EntityModel.of(
                new ProductDTO(2L, "鍵盤", 88.8),
                linkTo(methodOn(ProductController.class).queryProductById(2L)).withSelfRel(),
                linkTo(methodOn(ProductController.class).queryProducts()).withRel("all-products")
              )
        ) ;
    return list ;
  }
}

訪問/products/666接口,輸出結果.

圖片圖片

圖片圖片

以上是我們手動生成,如果你結合Spring REST Docs使用,那么你根本不需要自己寫這些。

責任編輯:武曉燕 來源: Spring全家桶實戰案例源碼
相關推薦

2009-10-22 09:52:37

2011-04-29 10:37:01

CRM

2025-03-26 02:00:00

API工具開發

2009-10-14 09:42:14

2013-09-13 14:43:16

2022-10-17 07:35:52

Kubernetes工具日志

2025-10-14 07:35:26

Kubernetes部署YAML

2018-03-12 13:25:51

2023-05-11 12:40:00

Spring控制器HTTP

2010-08-16 13:51:22

DIV+CSS

2024-09-26 08:03:37

2013-07-03 09:42:32

網絡管理系統升級故障排查

2024-03-04 13:23:00

數字化轉型

2013-08-15 09:47:07

云遷移云技術

2015-06-08 13:51:56

WiFi

2022-01-10 06:43:27

ATT&CK網絡安全攻擊

2020-04-29 14:37:24

JavaScript前端技術

2013-10-23 14:34:15

2023-11-06 13:56:20

2019-07-29 15:15:45

點贊
收藏

51CTO技術棧公眾號

日本不卡久久| 中文字幕久久久| 国产极品尤物在线| 日夜干在线视频| 日本一不卡视频| 欧美超级乱淫片喷水| 欧美肉大捧一进一出免费视频| 亚洲日本天堂| 亚洲精品中文在线| 欧美婷婷久久| 亚洲男人第一天堂| 日产国产高清一区二区三区| 久久久国产91| 少妇无套高潮一二三区| 中文字幕亚洲在线观看| 日本韩国精品在线| 日韩一区二区高清视频| 搞黄视频免费在线观看| 高清久久久久久| 国产精品视频专区| 日产精品久久久| 正在播放日韩欧美一页 | 乱子伦视频在线看| 羞羞的视频在线看| 国产精品麻豆视频| 久草精品电影| 亚洲国产精品视频在线| 美女一区二区三区| 日本国产高清不卡| 国产午夜久久久| 91精品国产乱码久久久久久久| 亚洲美女久久久| 中文字幕第3页| 国产一区二区| 欧美日本韩国一区二区三区视频| 成人在线免费在线观看| 色婷婷在线播放| 日韩码欧中文字| 色综合视频二区偷拍在线| 熟妇人妻一区二区三区四区| 国产精品一区专区| 成人精品一区二区三区电影免费| 亚洲性生活视频在线观看| 天堂…中文在线最新版在线| 成人在线观看免费网站| 国产精品三级久久久久三级| 日本电影一区二区三区| 免费福利在线观看| 99久久亚洲一区二区三区青草| 亚洲精品日韩av| 国产精品福利电影| 久久99久久99| 91免费的视频在线播放| 亚洲天堂手机版| 蜜臀91精品一区二区三区| 日本乱人伦a精品| 天天干在线播放| 欧美亚洲一级| 国产91久久婷婷一区二区| 欧美特黄aaaaaa| 亚洲一区黄色| 日韩免费在线播放| 国产天堂第一区| 美女脱光内衣内裤视频久久网站 | 杨幂一区欧美专区| 在线a免费看| 国产精品福利影院| 精品国产无码在线| 欧美寡妇性猛交xxx免费| 亚洲国产一区在线观看| 精品无码国产一区二区三区av| 国产极品人妖在线观看| 午夜视频一区二区三区| 午夜肉伦伦影院| 少妇精品视频一区二区免费看| 在线精品亚洲一区二区不卡| 国产福利在线免费| 久久在线观看| 亚洲第一级黄色片| 在线观看国产网站| 欧美精品色图| 久久视频免费观看| 精品亚洲永久免费| 久久精品一本| 国产欧美一区二区| 超碰福利在线观看| 91片黄在线观看| 亚洲第一久久影院| 国产伦精品一区二区三| 三级视频在线| 国产精品成人免费| 国产 日韩 欧美在线| 欧美艳星kaydenkross| 欧美精品自拍偷拍| 免费日本黄色网址| 成人激情视频| 九色成人免费视频| 黄色一级视频免费看| 精彩视频一区二区三区| 国产在线精品一区二区三区》| 福利视频在线看| 亚洲一区二区欧美| 精品少妇无遮挡毛片| 麻豆国产一区二区三区四区| 国产视频久久久| 国产一区二区播放| 久久婷婷一区| 国产 高清 精品 在线 a| 黄色av网址在线免费观看| 樱桃视频在线观看一区| 日日碰狠狠躁久久躁婷婷| 亚洲一区有码| 亚洲全黄一级网站| 久久免费视频6| 免播放器亚洲一区| 免费看成人片| bl视频在线免费观看| 欧美日韩在线三区| 97伦伦午夜电影理伦片| 欧美日本免费| 国产男女猛烈无遮挡91| 人成在线免费视频| 亚洲综合999| 手机免费av片| 经典一区二区| 91精品国产色综合久久不卡98口 | 中国一级特黄毛片| 国产精品18久久久久久久网站| 色综合影院在线| 欧美亚洲视频一区二区| 精品小视频在线观看| 激情五月婷婷综合网| 日本一区二区三区免费看| av在线小说| 成人av电影在线观看| 3751色影院一区二区三区| chinese麻豆新拍video| 欧美激情综合色综合啪啪| 国产精自产拍久久久久久| 免费国产在线观看| 欧美午夜精品在线| 日本免费福利视频| 国产日韩精品视频一区二区三区| 成人在线资源网址| 七七久久电影网| 精品国产一区a| 精品肉丝脚一区二区三区| 国内精品久久久久影院薰衣草| 亚洲黄色一区二区三区| 成人全视频免费观看在线看| 一区二区三区四区视频| 男人的天堂av网站| 久久精品人人做人人爽97| 欧美亚洲另类色图| 日韩欧美四区| 日本一区二区在线免费播放| 青青草视频在线观看| 色综合久久66| 欧美人与禽zoz0善交| 另类中文字幕网| 亚洲欧美日韩不卡| 国产精品一区免费在线| 精品综合久久久久久97| 亚洲精品视频网| 亚洲777理论| 亚洲第一成人网站| 日韩不卡一二三区| 成人手机视频在线| 欧美影院视频| 97人人做人人爱| 国产精品一级伦理| 欧美日韩国产高清一区| 黄色香蕉视频在线观看| a毛片不卡免费看片| 一区二区三区.www| www国产视频| 久久久夜夜夜| 综合视频免费看| 成人精品毛片| 日韩av电影在线免费播放| 最新av网站在线观看| 69堂国产成人免费视频| 精品少妇一二三区| 久久久久久免费网| 不卡中文字幕在线观看| 一本精品一区二区三区| 精品免费视频123区| 欧美国产大片| 久久亚洲国产精品| 欧美自拍偷拍一区二区| 色8久久人人97超碰香蕉987| 欧美一区二区三区观看| 国产 日韩 欧美大片| 91黄色小网站| 综合激情婷婷| 欧美日韩一区综合| 精品一区二区三区四区五区| 91国内产香蕉| 生活片a∨在线观看| 精品国产一区二区三区忘忧草| av手机天堂网| 亚洲一区二区三区在线看 | 99久久婷婷国产精品综合| 男女男精品视频站| 在线观看视频免费一区二区三区| 欧美男人的天堂一二区| av在线天堂网| 强制捆绑调教一区二区| 欧美亚洲黄色片| 日韩电影一区| 久久国产精品-国产精品| 性欧美video另类hd尤物| 91超碰caoporn97人人| 八戒八戒神马在线电影| 亚洲天堂av在线免费| 免费看日韩av| 欧美一区二区国产| 国产精品第六页| 午夜精品在线看| 青青青在线视频| 日韩美女视频19| 九九热免费在线| 久久久久久久综合| 91九色蝌蚪porny| 国产一区美女在线| 色噜噜狠狠一区二区| 久久精品人人做人人爽电影蜜月| 国产精品一色哟哟| 91精品一区国产高清在线gif| 日本a级片久久久| 亚洲国产网址| 久久久久久久免费| 国产成人一二片| julia一区二区中文久久94| 亚洲欧洲二区| 国产欧美日韩中文字幕在线| 日日av拍夜夜添久久免费| 91高清视频免费观看| ririsao久久精品一区| 欧美乱大交xxxxx另类电影| 生活片a∨在线观看| 9久草视频在线视频精品| 国产精品区一区二区三含羞草| 只有精品亚洲| 成人黄色片在线| 二区三区精品| 亚洲free性xxxx护士hd| 国产一区二区三区亚洲综合| 91麻豆国产语对白在线观看| 国产高清亚洲| 99久久久久国产精品免费| 2020最新国产精品| 国产精品果冻传媒潘| 国产精品男女| 国产综合 伊人色| 午夜欧洲一区| 欧美日韩在线精品| 不卡中文一二三区| 一区二区三区欧美成人| 91精品天堂福利在线观看| 91麻豆天美传媒在线| 欧美福利一区| 国产欧美日韩网站| 欧美亚洲专区| 最新天堂中文在线| 国产在线精品免费av| 美女日批在线观看| av高清不卡在线| 欧美激情aaa| 最新久久zyz资源站| 欧产日产国产v| 亚洲风情在线资源站| 久久久久99精品成人片我成大片| 日本高清不卡视频| 在线观看色网站| 精品日产卡一卡二卡麻豆| 天堂中文在线8| 色综合伊人色综合网站| 色呦呦在线观看视频| 欧美一级免费视频| 九九热这里有精品| 国产福利久久| 成人在线国产| 妞干网在线播放| 视频一区中文字幕| www.久久com| 久久新电视剧免费观看| 91视频最新网址| 亚洲成av人片在线| 日韩xxx视频| 亚洲成色999久久网站| 91在线视频| 午夜欧美大片免费观看| 99久久亚洲国产日韩美女| 国产chinese精品一区二区| 亚洲午夜久久| 久久久99精品视频| 久久性色av| 精品无码av一区二区三区| 国产日韩欧美激情| 影音先锋男人资源在线观看| 精品美女久久久久久免费| 一区二区的视频| 亚洲欧洲在线视频| 久久av色综合| 成人国产精品一区| 九九视频免费观看视频精品| av动漫在线免费观看| 日韩高清不卡一区二区三区| 中文字幕天堂av| 免费成人直播| 久久99热精品| 国内欧美日韩| 欧美日韩精品中文字幕一区二区| 欧美日韩国内| 亚洲精品视频三区| 国产无人区一区二区三区| 国产精品成人av久久| 这里是久久伊人| 91女主播在线观看| 日本国产精品视频| 卡一精品卡二卡三网站乱码| 黄频视频在线观看| 蜜桃视频一区二区三区 | 久久精品免费在线观看| 久久免费在线观看视频| 51久久夜色精品国产麻豆| h视频在线免费| 国产福利视频一区二区| 开心激情综合| 欧美亚洲黄色片| 国产不卡视频一区| 波多野结衣爱爱视频| 欧美人妖巨大在线| 日韩在线资源| 国产精品自产拍高潮在线观看| 国产va免费精品观看精品视频| 日本国产在线播放| 北岛玲一区二区三区四区| 欧美成人三级视频| 日韩一区二区三区精品视频| 美女国产在线| 91久久精品国产91性色| 999视频精品| 五月天中文字幕在线| 中文字幕一区二区在线播放| 中文字幕无线码一区| 中文字幕一区二区三区电影| 日韩成人综合网站| 自拍亚洲欧美老师丝袜| 国产精品一二三| 中文字幕影音先锋| 精品欧美乱码久久久久久1区2区 | 一区二区三区欧美日| 99国产在线播放| 色综合91久久精品中文字幕 | 欧美中文娱乐网| 日韩成人一级片| 国产精品一区二区亚洲| 欧美精品乱码久久久久久| 黄色网址免费在线观看| 91精品国产一区二区三区动漫| 欧美精品九九| yy1111111| 欧美午夜电影网| a天堂中文在线官网在线| 亚洲免费中文字幕| 伊人网在线视频观看| 懂色aⅴ精品一区二区三区蜜月| 日本福利在线观看| 国产精品观看在线亚洲人成网| 久久久影院免费| 香蕉视频1024| 色香蕉久久蜜桃| 国产福利视频在线| 国产精品免费观看高清| 麻豆91精品| 看免费黄色录像| 亚洲国产成人91精品| 欧美人体一区二区三区| 在线观看欧美激情| 成人精品一区二区三区四区 | 久久青青草原一区二区| 三级影片在线观看欧美日韩一区二区 | 欧美a在线观看| 日韩av综合在线观看| 欧美精彩视频一区二区三区| 99热这里是精品| 欧美中文字幕第一页| 99久久www免费| 中文字幕丰满孑伦无码专区| 欧美日韩国产精品自在自线| h片在线观看下载| 亚洲v国产v| 成人91在线观看| 国产精品久久久久久久免费| 91福利视频网| 午夜欧美精品久久久久久久| av网在线播放| 亚洲电影免费观看高清完整版在线观看 |