Версионирование REST API — это практика управления изменениями в API таким образом, чтобы клиенты могли продолжать работать с текущей версией, пока адаптируют свои системы к новой. Это особенно важно для публичных API, где множество клиентов зависят от стабильности интерфейса.
Это самый распространенный подход, при котором версия API указывается непосредственно в URI.
Пример:
GET /api/v1/users
GET /api/v2/users
Преимущества:
Недостатки:
Версия API указывается в HTTP-заголовке, например, Accept
или кастомном заголовке.
Пример:
GET /users
Accept: application/vnd.myapi.v1+json
Преимущества:
Недостатки:
Версия API указывается в параметре запроса.
Пример:
GET /users?version=1
Преимущества:
Недостатки:
Версия API определяется через медиа-типы в заголовке Accept
.
Пример:
GET /users
Accept: application/vnd.myapi.v1+json
Преимущества:
Недостатки:
@RestController
@RequestMapping("/api/v1/users")
public class UserControllerV1 {
@GetMapping
public List<User> getUsers() {
// Логика для версии 1
return Arrays.asList(new User("John Doe", "john@example.com"));
}
}
@RestController
@RequestMapping("/api/v2/users")
public class UserControllerV2 {
@GetMapping
public List<UserV2> getUsers() {
// Логика для версии 2
return Arrays.asList(new UserV2("John Doe", "john@example.com", "123-456-7890"));
}
}
public class User {
private String name;
private String email;
// Конструкторы, геттеры и сеттеры
}
public class UserV2 {
private String name;
private String email;
private String phone;
// Конструкторы, геттеры и сеттеры
}
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
configurer.defaultContentType(MediaType.APPLICATION_JSON);
}
}
@RestController
@RequestMapping("/users")
public class UserController {
@GetMapping
public ResponseEntity<?> getUsers(@RequestHeader("Accept") String acceptHeader) {
if (acceptHeader.contains("vnd.myapi.v1+json")) {
return ResponseEntity.ok(Arrays.asList(new User("John Doe", "john@example.com")));
} else if (acceptHeader.contains("vnd.myapi.v2+json")) {
return ResponseEntity.ok(Arrays.asList(new UserV2("John Doe", "john@example.com", "123-456-7890")));
} else {
return ResponseEntity.status(HttpStatus.NOT_ACCEPTABLE).build();
}
}
}
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
configurer.mediaType("v1", MediaType.valueOf("application/vnd.myapi.v1+json"));
configurer.mediaType("v2", MediaType.valueOf("application/vnd.myapi.v2+json"));
}
}
Версионирование REST API — это важная практика, которая позволяет управлять изменениями в API без нарушения работы существующих клиентов. Существует несколько подходов к версионированию, включая версионирование через URI, заголовки, параметры запроса и медиа-типы. Каждый из них имеет свои преимущества и недостатки, и выбор подхода зависит от конкретных требований проекта. В Spring Boot версионирование можно легко реализовать с использованием аннотаций и конфигураций, что делает процесс разработки гибким и удобным.