middle
Что такое Content Negotiation?
Content Negotiation (согласование содержимого) — механизм HTTP, позволяющий клиенту и серверу договориться о формате представления ресурса.
Клиент указывает желаемый формат через заголовки:
Accept— желаемый формат ответа (application/json,application/xml).Accept-Language— предпочитаемый язык (ru,en).Accept-Encoding— предпочитаемое сжатие (gzip,deflate).Content-Type— формат отправляемых данных в теле запроса.
Пример
GET /api/users/42 HTTP/1.1
Accept: application/json
Accept-Language: ru
Ответ:
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Content-Language: ru
Если сервер не может вернуть данные в запрошенном формате, он возвращает 406 Not Acceptable.
Реализация в Spring
// Spring автоматически поддерживает JSON и XML
@RestController
@RequestMapping("/api/users")
public class UserController {
// Поддерживает и JSON, и XML
@GetMapping(value = "/{id}",
produces = {MediaType.APPLICATION_JSON_VALUE,
MediaType.APPLICATION_XML_VALUE})
public User getUser(@PathVariable Long id) {
return userService.findById(id);
}
// Принимает JSON или XML
@PostMapping(consumes = {MediaType.APPLICATION_JSON_VALUE,
MediaType.APPLICATION_XML_VALUE})
public ResponseEntity<User> createUser(@RequestBody User user) {
User saved = userService.save(user);
return ResponseEntity.status(HttpStatus.CREATED).body(saved);
}
}
Для поддержки XML в Spring Boot необходимо добавить зависимость:
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
</dependency>
На собеседовании: достаточно объяснить механизм через заголовки Accept/Content-Type и упомянуть код 406. Частая ошибка — путать Accept (чего хочет клиент) и Content-Type (что реально отправлено).