接口(API)开发核心知识点

发布于:2025-05-14 ⋅ 阅读:(14) ⋅ 点赞:(0)

接口(API)开发核心知识点

一、API基础概念

1. 什么是API

  • API (Application Programming Interface):应用程序编程接口
  • Web API:基于HTTP协议的接口,用于系统间数据交互
  • RESTful API:符合REST架构风格的API设计

2. API设计原则

  • 统一接口:使用标准HTTP方法(GET, POST, PUT, DELETE等)
  • 无状态:每个请求包含处理所需的所有信息
  • 资源导向:URI指向资源而非动作
  • 表述性:资源与表现形式分离(JSON/XML等)

二、RESTful API设计规范

1. 资源命名

  • 使用名词复数形式表示资源:

    /users        # 用户集合
    /users/123    # ID为123的用户
    /users/123/orders  # 用户123的订单
    

2. HTTP方法使用

方法 描述 示例
GET 获取资源 GET /users
POST 创建资源 POST /users
PUT 全量更新资源 PUT /users/123
PATCH 部分更新资源 PATCH /users/123
DELETE 删除资源 DELETE /users/123
HEAD 获取资源元数据 HEAD /users

3. 状态码规范

状态码 含义
200 OK - 成功
201 Created - 创建成功
204 No Content - 无内容
400 Bad Request - 请求错误
401 Unauthorized - 未授权
403 Forbidden - 禁止访问
404 Not Found - 资源不存在
500 Server Error - 服务器错误

4. 请求/响应设计

  • 请求头

    Accept: application/json
    Content-Type: application/json
    Authorization: Bearer <token>
    
  • 请求体(JSON示例):

    {
      "username": "john_doe",
      "email": "john@example.com"
    }
    
  • 响应体(JSON示例):

    {
      "status": "success",
      "data": {
        "id": 123,
        "username": "john_doe"
      },
      "message": "User created successfully"
    }
    

三、API开发技术栈

1. Java常用框架

  • Spring Boot:快速构建API服务
  • Spring MVC:处理HTTP请求/响应
  • JAX-RS:Java API for RESTful Web Services
  • Swagger/OpenAPI:API文档生成

2. 数据库访问

  • JDBC:Java数据库连接
  • JPA/Hibernate:ORM框架
  • MyBatis:SQL映射框架
  • Spring Data:简化数据访问

3. 安全认证

  • Basic Auth:基本认证
  • JWT:JSON Web Token
  • OAuth2:开放授权协议
  • Spring Security:安全框架

四、Spring Boot实现API示例

1. 控制器示例

@RestController
@RequestMapping("/api/users")
public class UserController {
    
    @Autowired
    private UserService userService;
    
    // 获取用户列表
    @GetMapping
    public ResponseEntity<List<User>> getAllUsers() {
        return ResponseEntity.ok(userService.findAll());
    }
    
    // 获取单个用户
    @GetMapping("/{id}")
    public ResponseEntity<User> getUserById(@PathVariable Long id) {
        return userService.findById(id)
                .map(ResponseEntity::ok)
                .orElse(ResponseEntity.notFound().build());
    }
    
    // 创建用户
    @PostMapping
    public ResponseEntity<User> createUser(@Valid @RequestBody User user) {
        User savedUser = userService.save(user);
        URI location = ServletUriComponentsBuilder.fromCurrentRequest()
                .path("/{id}")
                .buildAndExpand(savedUser.getId())
                .toUri();
        return ResponseEntity.created(location).body(savedUser);
    }
    
    // 更新用户
    @PutMapping("/{id}")
    public ResponseEntity<User> updateUser(
            @PathVariable Long id, 
            @Valid @RequestBody User user) {
        return ResponseEntity.ok(userService.update(id, user));
    }
    
    // 删除用户
    @DeleteMapping("/{id}")
    public ResponseEntity<Void> deleteUser(@PathVariable Long id) {
        userService.delete(id);
        return ResponseEntity.noContent().build();
    }
}

2. 统一响应封装

public class ApiResponse<T> {
    private String status;
    private T data;
    private String message;
    
    // 构造方法、getter/setter省略
    
    public static <T> ApiResponse<T> success(T data) {
        return new ApiResponse<>("success", data, null);
    }
    
    public static ApiResponse<?> error(String message) {
        return new ApiResponse<>("error", null, message);
    }
}

3. 全局异常处理

@ControllerAdvice
public class GlobalExceptionHandler {
    
    @ExceptionHandler(ResourceNotFoundException.class)
    public ResponseEntity<ApiResponse<?>> handleNotFound(ResourceNotFoundException ex) {
        return ResponseEntity.status(HttpStatus.NOT_FOUND)
                .body(ApiResponse.error(ex.getMessage()));
    }
    
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ApiResponse<?>> handleValidation(MethodArgumentNotValidException ex) {
        List<String> errors = ex.getBindingResult()
                .getFieldErrors()
                .stream()
                .map(FieldError::getDefaultMessage)
                .collect(Collectors.toList());
        return ResponseEntity.badRequest()
                .body(ApiResponse.error(errors.toString()));
    }
    
    @ExceptionHandler(Exception.class)
    public ResponseEntity<ApiResponse<?>> handleAll(Exception ex) {
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                .body(ApiResponse.error("Internal server error"));
    }
}

五、API安全

1. JWT认证实现

// JWT工具类
public class JwtTokenUtil {
    private static final String SECRET = "your-secret-key";
    private static final long EXPIRATION = 86400000; // 24小时
    
    public static String generateToken(UserDetails userDetails) {
        return Jwts.builder()
                .setSubject(userDetails.getUsername())
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION))
                .signWith(SignatureAlgorithm.HS512, SECRET)
                .compact();
    }
    
    public static String getUsernameFromToken(String token) {
        return Jwts.parser()
                .setSigningKey(SECRET)
                .parseClaimsJws(token)
                .getBody()
                .getSubject();
    }
    
    public static boolean validateToken(String token, UserDetails userDetails) {
        final String username = getUsernameFromToken(token);
        return (username.equals(userDetails.getUsername()) && !isTokenExpired(token));
    }
    
    private static boolean isTokenExpired(String token) {
        Date expiration = Jwts.parser()
                .setSigningKey(SECRET)
                .parseClaimsJws(token)
                .getBody()
                .getExpiration();
        return expiration.before(new Date());
    }
}

2. Spring Security配置

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    
    @Autowired
    private UserDetailsService userDetailsService;
    
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()
            .authorizeRequests()
                .antMatchers("/api/auth/**").permitAll()
                .anyRequest().authenticated()
            .and()
            .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and()
            .addFilter(new JwtAuthenticationFilter(authenticationManager()))
            .addFilter(new JwtAuthorizationFilter(authenticationManager()));
    }
    
    @Override
    public void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
    }
    
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

六、API文档

1. Swagger配置

@Configuration
@EnableSwagger2
public class SwaggerConfig {
    
    @Bean
    public Docket api() {
        return new Docket(DocumentationType.SWAGGER_2)
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.example.api"))
                .paths(PathSelectors.any())
                .build()
                .apiInfo(apiInfo());
    }
    
    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("API Documentation")
                .description("API reference for developers")
                .version("1.0")
                .build();
    }
}

2. OpenAPI 3.0配置

@Configuration
public class OpenApiConfig {
    
    @Bean
    public OpenAPI customOpenAPI() {
        return new OpenAPI()
                .info(new Info()
                        .title("API Documentation")
                        .version("1.0")
                        .description("API reference for developers")
                        .license(new License().name("Apache 2.0")))
                .externalDocs(new ExternalDocumentation()
                        .description("API Wiki Documentation")
                        .url("https://example.com/docs"));
    }
}

七、API测试

1. Postman测试

  • 请求示例

    GET http://localhost:8080/api/users
    Headers:
      Authorization: Bearer <token>
      Accept: application/json
    

2. 单元测试示例

@SpringBootTest
@AutoConfigureMockMvc
class UserControllerTest {
    
    @Autowired
    private MockMvc mockMvc;
    
    @Test
    void shouldReturnAllUsers() throws Exception {
        mockMvc.perform(get("/api/users")
                .contentType(MediaType.APPLICATION_JSON))
                .andExpect(status().isOk())
                .andExpect(jsonPath("$", hasSize(2)));
    }
    
    @Test
    void shouldCreateUser() throws Exception {
        String userJson = "{\"username\":\"test\",\"email\":\"test@example.com\"}";
        
        mockMvc.perform(post("/api/users")
                .contentType(MediaType.APPLICATION_JSON)
                .content(userJson))
                .andExpect(status().isCreated())
                .andExpect(jsonPath("$.username").value("test"));
    }
}

八、API性能优化

1. 缓存策略

  • 客户端缓存Cache-Control
  • 服务端缓存:Redis, Memcached
  • 数据库缓存:查询缓存

2. 分页与限流

  • 分页参数

    GET /api/users?page=1&size=20
    
  • 限流实现

    @RateLimiter(value = 10, key = "#userId") // 每秒10次
    @GetMapping("/api/users/{userId}")
    public ResponseEntity<User> getUser(@PathVariable String userId) {
        // ...
    }
    

3. 异步处理

@Async
public CompletableFuture<User> getUserAsync(Long id) {
    return CompletableFuture.completedFuture(userRepository.findById(id).orElse(null));
}

九、微服务API网关

1. Spring Cloud Gateway

spring:
  cloud:
    gateway:
      routes:
        - id: user-service
          uri: lb://user-service
          predicates:
            - Path=/api/users/**
          filters:
            - StripPrefix=1

2. 常见网关功能

  • 路由转发
  • 负载均衡
  • 熔断降级
  • 权限验证
  • 请求限流
  • 日志监控

以上是API开发的核心知识点,涵盖了设计规范、实现技术、安全认证、文档生成和性能优化等方面,掌握这些内容可以开发出高质量、安全可靠的API接口。


网站公告

今日签到

点亮在社区的每一天
去签到