精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

日韩乱码人妻无码中文字幕| 毛葺葺老太做受视频| 精品国产va久久久久久久| 你懂的国产精品| 日韩成人在线播放| 日韩av在线中文| 日韩激情av| 国产午夜亚洲精品理论片色戒| 成人欧美一区二区三区黑人孕妇| 国产精品成人免费一区二区视频| 综合国产视频| 欧美成人a视频| 亚洲一二三区av| 黄网av在线| 国产精品看片你懂得| 国产伦一区二区三区色一情| 在线视频 中文字幕| 亚洲三级网站| 欧美另类在线播放| 日本人亚洲人jjzzjjz| 91精品久久久久久综合五月天| 91国产免费看| 无罩大乳的熟妇正在播放| 黄色在线免费网站| 国产亚洲精品bt天堂精选| 91手机在线观看| 伊人亚洲综合网| 国产日韩欧美一区| 欧美成人精品在线| www.涩涩爱| 中文字幕亚洲影视| 亚洲激情小视频| 男人的天堂免费| 国产91欧美| 在线亚洲免费视频| 日韩黄色片视频| 美足av综合网| 亚洲精品视频免费观看| 偷拍视频一区二区| 国产视频网站在线| 91蜜桃婷婷狠狠久久综合9色| 99高清视频有精品视频| 99国产在线播放| 激情久久五月天| 国产精品亚发布| 亚洲精品91天天久久人人| 国产婷婷精品| 国内揄拍国内精品少妇国语| 波多野结衣亚洲色图| 久久亚洲国产| 久久精品视频99| 波兰性xxxxx极品hd| 欧美综合另类| 少妇av一区二区三区| 四虎成人免费影院| 波多野结衣在线播放一区| 亚洲天堂成人在线| аⅴ天堂中文在线网| 精品国产一区二区三区久久久樱花| 亚洲乱码国产乱码精品精天堂| 色噜噜在线观看| 欧美日韩精品一区二区三区在线观看| 亚洲福利在线播放| 久久偷拍免费视频| 岳的好大精品一区二区三区| 亚洲美女中文字幕| 欧美大波大乳巨大乳| 欧美丝袜丝交足nylons172| 欲色天天网综合久久| 婷婷综合在线视频| 亚洲乱码精品| 欧美丰满少妇xxxx| 看片网址国产福利av中文字幕| 99热免费精品| 国产精品成人国产乱一区| 中文精品久久久久人妻不卡| 久久精品国产99| 147欧美人体大胆444| 黄色一级a毛片| 久久一日本道色综合| 色综合电影网| 羞羞视频在线免费国产| 亚洲高清一区二区三区| 日本三级免费观看| 99久久999| 亚洲福利视频二区| 国产亚洲精品精品精品| 一级毛片免费高清中文字幕久久网| 色综合久久久久久中文网| 国产免费av一区二区| 日韩电影在线免费观看| 91香蕉国产在线观看| 日日夜夜精品免费| 中文字幕国产一区| 人妻激情另类乱人伦人妻| 美女av在线免费看| 在线播放亚洲一区| 亚洲男人在线天堂| 国产精品久久久久久麻豆一区软件 | 久久综合色8888| 在线观看精品视频| 国产黄大片在线观看| 欧美日韩精品久久久| 99re这里只有| 婷婷久久综合| 国产成人在线一区| 成人免费一级视频| 国产精品私人自拍| 水蜜桃色314在线观看| 九七影院97影院理论片久久 | 亚洲啪av永久无码精品放毛片| 欧美男gay| 色综合色综合久久综合频道88| www.久久视频| www.日本不卡| 色哟哟免费网站| 成人性片免费| 亚洲女在线观看| 久久久久香蕉视频| 久久国产视频网| 蜜桃视频在线观看91| 欧美性猛片xxxxx免费中国| 欧美日韩中文另类| 中国美女乱淫免费看视频| 国产综合自拍| 91手机视频在线观看| 日本最黄一级片免费在线| 一本色道综合亚洲| 欧类av怡春院| 激情久久中文字幕| 99视频在线免费观看| 超碰caoporn久久| 欧美色电影在线| 少妇久久久久久久久久| 亚洲在线观看| 国产私拍一区| 丁香花高清在线观看完整版| 337p亚洲精品色噜噜噜| 精品熟妇无码av免费久久| 久久精品日韩欧美| 久久综合色一本| 91色在线看| 亚洲成人久久一区| 国产精品7777| av不卡一区二区三区| 国产精品12345| 欧美aaaaa级| 91国产在线精品| 亚洲av片在线观看| 狠狠做深爱婷婷久久综合一区| 老司机免费视频| 亚洲精品专区| 久久99精品久久久久久水蜜桃| 国产高潮在线| 亚洲欧美激情一区| 国产午夜麻豆影院在线观看| 久久亚洲春色中文字幕久久久| 免费看一级大黄情大片| 网曝91综合精品门事件在线| 456亚洲影院| 国际av在线| 欧美性猛交xxxxxx富婆| 免费看特级毛片| 国产精品白丝jk黑袜喷水| 日本男女交配视频| 秋霞综合在线视频| 国产精品第100页| 九七电影韩国女主播在线观看| 91精品福利在线一区二区三区| 国产精品免费人成网站酒店| 国产成人精品三级| 日本在线xxx| 精品亚洲成人| 亚洲xxxx18| av中文资源在线资源免费观看| 亚洲九九九在线观看| 亚洲天堂狠狠干| 亚洲香蕉伊在人在线观| 9.1成人看片免费版| 日本不卡在线视频| 四虎免费在线观看视频| 北条麻妃一区二区三区在线| 欧美中文字幕视频在线观看| 电影av在线| 日韩视频在线一区二区| 在线免费观看毛片| 国产欧美综合在线| 久草福利在线观看| 免费中文字幕日韩欧美| 一区二区国产日产| 久草在线综合| 国产美女精品视频| h片在线观看下载| 亚洲偷欧美偷国内偷| 精品女同一区二区三区| 色欲综合视频天天天| 91麻豆免费视频网站| 91在线观看污| 中文字幕一区二区三区四| 国产日韩欧美一区在线| 欧美日韩一级在线| 亚洲国产成人精品综合99| free性m.freesex欧美| 日韩精品欧美激情| 国产精品久久久久久免费播放| 亚洲第一搞黄网站| 女同久久另类69精品国产| 成人美女在线视频| 九九热精品在线播放| 亚洲黄色大片| 手机在线视频你懂的| 久久99久久人婷婷精品综合 | 国产丰满美女做爰| 日本丶国产丶欧美色综合| 久久精品一区二区三| 国产欧美日韩中文久久| v天堂中文在线| 国产一区二区在线影院| 狠狠热免费视频| 亚洲欧美久久久| 97中文字幕在线| 国产国产精品| 无码免费一区二区三区免费播放| 国语一区二区三区| 91久久极品少妇xxxxⅹ软件| 国产精品第一国产精品| 欧美中文字幕视频在线观看| 超碰在线最新网址| 色综合视频一区中文字幕| 麻豆视频网站在线观看| 一区二区亚洲欧洲国产日韩| 性xxxx18| 亚洲国产精品成人va在线观看| 国产chinasex对白videos麻豆| 欧美性xxxxx极品少妇| av网站中文字幕| 精品久久久久久久久中文字幕| 免费在线观看亚洲| 一区二区三区在线视频观看58| 91传媒免费观看| 中文字幕亚洲在| 少妇高潮在线观看| 国产精品久久久久三级| 最新av电影网站| 中文字幕一区二区三区乱码在线| 男人在线观看视频| 亚洲色欲色欲www在线观看| 欧美日韩色视频| 亚洲欧美一区二区三区国产精品| 最新av电影网站| 一色桃子久久精品亚洲| 精品国产精品国产精品| 亚洲啪啪综合av一区二区三区| 国产女人18水真多毛片18精品| 亚洲精品国产一区二区精华液| 在线看的片片片免费| 亚洲制服丝袜av| 国产第一页第二页| 亚洲成人av一区二区三区| 在线观看黄网站| 日韩欧美国产激情| 中文字幕一区二区三区波野结| 欧美日韩一区 二区 三区 久久精品| 中文字幕av久久爽| 欧美一级免费大片| 丰满人妻一区二区三区四区53 | 欧美性一级生活| 波多野结衣视频在线看| 欧美久久婷婷综合色| 国产熟女一区二区三区四区| 精品国产免费人成在线观看| 完全免费av在线播放| 国产日产欧美精品| 天堂精品在线视频| 精品国产乱码久久久久久久软件 | 久久久精品国产免费观看同学| 亚洲图片第一页| 一区二区三区高清| 日韩欧美成人一区二区三区| 欧美午夜理伦三级在线观看| 国产欧美日韩综合精品一区二区三区| 精品国产一区二区三区四区四 | 久久人人爽人人爽人人片亚洲 | 婷婷国产v国产偷v亚洲高清| 区一区二在线观看| 欧美一激情一区二区三区| 亚洲欧美日韩精品永久在线| 中文在线资源观看视频网站免费不卡| 国产在线69| 欧美壮男野外gaytube| 日本成人在线网站| 国产一区二区三区高清视频| 人人狠狠综合久久亚洲婷婷| 久久成人福利视频| 日韩**一区毛片| 亚洲一区二区三区四区av| 国产农村妇女毛片精品久久麻豆 | 欧美中文字幕一区| 韩国av免费在线| 日韩中文字幕网站| 日韩伦理在线一区| 亚洲最大福利视频网| 尤物tv在线精品| a级免费在线观看| 久久国产人妖系列| 国产美女喷水视频| 亚洲综合视频网| 中文字幕日韩第一页| 亚洲成人网av| 成人福利片网站| 国产精品青青在线观看爽香蕉| 久久视频在线观看| 波多野结衣 作品| 蜜臀国产一区二区三区在线播放| 午夜视频在线观看国产| 亚洲男人电影天堂| 人妻中文字幕一区二区三区| 亚洲精品美女在线观看播放| 污网站在线免费看| 成人黄色免费片| 欧美日韩性在线观看| 青青艹视频在线| 成人午夜伦理影院| 成年人av电影| 51精品视频一区二区三区| 不卡在线视频| 国产成人激情视频| 蜜桃精品wwwmitaows| 成人免费aaa| 99久久伊人久久99| 久久在线视频精品| 日韩一二三四区| www.欧美日本韩国| 成人在线播放av| 99久久夜色精品国产亚洲1000部| 九色91popny| 国产日产欧美一区二区三区| 亚洲欧美日韩激情| 亚洲美女性生活视频| 超碰超碰人人人人精品| 韩国一区二区三区美女美女秀 | 日韩国产一区二区| 欧美婷婷精品激情| 国产精品你懂的在线欣赏| 中文字幕第315页| 日韩在线观看免费全集电视剧网站 | 亚洲色图欧美视频| 欧美亚洲激情视频| 亚洲深夜福利在线观看| 热久久精品国产| 国产欧美日韩不卡免费| 在线免费av网| 欧美成年人视频网站| 综合久久成人| 色欲色香天天天综合网www| 91在线视频官网| 亚洲天堂五月天| 日韩有码视频在线| 国产精品igao视频网网址不卡日韩| 91制片厂免费观看| 风流少妇一区二区| 欧美一级片免费在线观看| 亚洲欧美日韩国产精品| 欧洲成人一区| 五月天男人天堂| 粉嫩久久99精品久久久久久夜| 男女视频免费看| 国产一区二区日韩精品欧美精品| 国产激情欧美| 欧美视频在线第一页| 26uuu国产在线精品一区二区| 波多野结衣影片| 久久精品中文字幕电影| heyzo欧美激情| 国产情侣av自拍| 亚洲免费av在线| 神马亚洲视频| 国产视频观看一区| 红桃视频欧美| 美女100%露胸无遮挡| 日韩精品中文字幕在线不卡尤物| 少妇视频一区| 一区二区三区一级片| 99久久精品免费精品国产| 国产精品尤物视频| 欧美国产乱视频| 深爱激情综合| 日本成人在线免费| 色香色香欲天天天影视综合网| 九义人在线观看完整免费版电视剧| 国产精品精品软件视频| 日韩av午夜在线观看| 久青草免费视频| 在线播放日韩欧美| aiai久久| 一区二区三区四区毛片| 欧美性xxxxxxxxx| 宅男在线观看免费高清网站| 日韩精品一线二线三线| 成人av在线一区二区|