Gymterview
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 (что реально отправлено).