← Назад к вопросам

Какие знаешь заголовки http которые отвечают за формат?

1.2 Junior🔥 231 комментариев
#REST API и микросервисы#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

HTTP заголовки, отвечающие за формат

HTTP заголовки — критичны для правильного обмена данными между клиентом и сервером. Разберу самые важные, которые отвечают за формат и кодировку данных.

1. Content-Type (самый важный)

Сообщает тип контента, который отправляется:

import org.springframework.web.bind.annotation.*;
import org.springframework.http.MediaType;
import org.springframework.http.HttpHeaders;

@RestController
@RequestMapping("/api")
public class ContentTypeExample {
    // JSON ответ
    @GetMapping("/users")
    @ResponseBody
    public User getUser() {
        // Content-Type: application/json автоматический
        return new User("John", 30);
    }
    
    // Явно указать Content-Type
    @PostMapping(consumes = MediaType.APPLICATION_JSON_VALUE)
    public void createUser(@RequestBody User user) {
        // Ожидаем application/json
    }
    
    // XML ответ
    @GetMapping("/users/xml", produces = MediaType.APPLICATION_XML_VALUE)
    public User getUserXml() {
        return new User("John", 30);
    }
    
    // HTML ответ
    @GetMapping("/html", produces = MediaType.TEXT_HTML_VALUE)
    public String getHtml() {
        return "<html><body>Hello</body></html>";
    }
    
    // Plain text
    @GetMapping("/text", produces = MediaType.TEXT_PLAIN_VALUE)
    public String getText() {
        return "Plain text response";
    }
}

Основные MIME типы:

Application/json              -> JSON данные
application/xml               -> XML данные
text/html                     -> HTML страница
text/plain                    -> Простой текст
text/css                      -> CSS стили
text/javascript               -> JavaScript код
image/png                     -> PNG изображение
image/jpeg                    -> JPEG изображение
application/pdf               -> PDF файл
application/octet-stream      -> Бинарные данные (скачивание)
application/x-www-form-urlencoded -> HTML форма данные
multipart/form-data           -> Загрузка файлов
application/hal+json          -> HAL JSON (REST API)
application/vnd.api+json      -> JSON API

С параметрами:

@GetMapping("/users")
public ResponseEntity<User> getUser() {
    HttpHeaders headers = new HttpHeaders();
    // Указать кодировку
    headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
    // Или
    headers.set(HttpHeaders.CONTENT_TYPE, "application/json; charset=UTF-8");
    
    return new ResponseEntity<>(new User("John", 30), headers);
}

2. Accept (что клиент готов принять)

Клиент сообщает какие форматы он поддерживает:

@RestController
public class AcceptHeaderExample {
    @GetMapping("/users")
    public ResponseEntity<String> getUser(@RequestHeader("Accept") String accept) {
        // Client может запросить: Accept: application/json, application/xml;q=0.9
        
        if (accept.contains("application/json")) {
            return ResponseEntity.ok()
                .contentType(MediaType.APPLICATION_JSON)
                .body("{\"name\":\"John\"}");
        } else if (accept.contains("application/xml")) {
            return ResponseEntity.ok()
                .contentType(MediaType.APPLICATION_XML)
                .body("<User><name>John</name></User>");
        } else {
            return ResponseEntity.ok()
                .body("John");
        }
    }
    
    // Spring автоматически обрабатывает Accept
    @GetMapping(value = "/data", 
                produces = {"application/json", "application/xml"})
    public Data getData() {
        // Spring выберет подходящий формат
        return new Data();
    }
}

Content Negotiation (автоматический выбор формата):

# application.yml
spring:
  mvc:
    contentnegotiation:
      favor-parameter: true
      parameter-name: format
// GET /api/users?format=json -> JSON
// GET /api/users?format=xml -> XML

3. Content-Encoding (кодирование/сжатие)

Сжимает тело ответа для уменьшения размера:

@RestController
public class EncodingExample {
    @GetMapping("/data")
    public ResponseEntity<String> getData() {
        HttpHeaders headers = new HttpHeaders();
        // Сжать с gzip
        headers.set(HttpHeaders.CONTENT_ENCODING, "gzip");
        
        String largeData = "...very large data...";
        byte[] compressed = compress(largeData); // gzip
        
        return ResponseEntity.ok()
            .headers(headers)
            .body(new String(compressed));
    }
    
    // Spring Boot автоматически сжимает если включить
    // server.compression.enabled=true
    // server.compression.min-response-size=1024
}

Основные кодировки:

  • gzip — самое распространённое
  • deflate — более старое сжатие
  • br — Brotli (более современное)
  • compress — LZW (редко)
  • identity — без кодирования
# HTTP request с Accept-Encoding
GET /api/data HTTP/1.1
Accept-Encoding: gzip, deflate, br

# HTTP response с Content-Encoding
HTTP/1.1 200 OK
Content-Encoding: gzip
Content-Length: 1234

4. Transfer-Encoding (кодирование при передаче)

Как передаются данные при неизвестном размере:

@RestController
public class TransferEncodingExample {
    // Streaming ответ с chunked encoding
    @GetMapping("/stream")
    public StreamingResponseBody streamData() {
        return outputStream -> {
            // Transfer-Encoding: chunked
            for (int i = 0; i < 1000000; i++) {
                outputStream.write(("data-" + i + "\n").getBytes());
                outputStream.flush();
            }
        };
    }
}

// HTTP response
// Transfer-Encoding: chunked
// 
// 10\r\n
// data-0\ndata-1\n\r\n
// 10\r\n
// data-2\ndata-3\n\r\n

5. Charset (кодировка символов)

Какую кодировку использует текст:

@RestController
public class CharsetExample {
    @GetMapping("/data")
    public ResponseEntity<String> getData() {
        HttpHeaders headers = new HttpHeaders();
        // UTF-8 кодировка
        headers.setContentType(new MediaType("application", "json", StandardCharsets.UTF_8));
        // Или явно
        headers.set(HttpHeaders.CONTENT_TYPE, "application/json; charset=UTF-8");
        
        String data = "{\"message\":\"Привет мир\"}"; // UTF-8 текст
        return new ResponseEntity<>(data, headers);
    }
}

Часто используемые:

  • UTF-8 — универсальная, поддерживает все языки
  • ISO-8859-1 — Latin-1, для европейских языков
  • Windows-1252 — Microsoft Windows кодировка
  • ASCII — только английские буквы

6. Accept-Encoding (какие кодировки клиент поддерживает)

@RestController
public class AcceptEncodingExample {
    @GetMapping("/data")
    public ResponseEntity<String> getData(
            @RequestHeader(value = "Accept-Encoding", required = false) String encoding) {
        // Клиент может отправить:
        // Accept-Encoding: gzip, deflate, br, identity;q=0.1
        
        String data = "...large data...";
        
        if (encoding != null && encoding.contains("gzip")) {
            // Сжать с gzip
            byte[] compressed = compressWithGzip(data);
            return ResponseEntity.ok()
                .header(HttpHeaders.CONTENT_ENCODING, "gzip")
                .body(new String(compressed));
        }
        
        return ResponseEntity.ok(data);
    }
}

7. Accept-Language (какой язык предпочитает клиент)

Для i18n (интернационализация):

@RestController
public class LanguageExample {
    @GetMapping("/greeting")
    public String getGreeting(
            @RequestHeader(value = "Accept-Language", required = false) String language) {
        // Клиент может отправить:
        // Accept-Language: en-US,en;q=0.9,ru;q=0.8
        
        if (language != null && language.startsWith("ru")) {
            return "Привет, мир!";
        }
        return "Hello, World!";
    }
}

8. Accept-Charset (какие кодировки символов поддерживает клиент)

@RestController
public class CharsetNegotiationExample {
    @GetMapping("/data")
    public ResponseEntity<String> getData(
            @RequestHeader(value = "Accept-Charset", required = false) String charset) {
        // Клиент может запросить:
        // Accept-Charset: utf-8, iso-8859-1;q=0.5
        
        String data = "...text with special chars: é, ñ, ü...";
        
        HttpHeaders headers = new HttpHeaders();
        headers.set(HttpHeaders.CONTENT_TYPE, 
                   "text/plain; charset=UTF-8");
        
        return new ResponseEntity<>(data, headers);
    }
}

9. Content-Length (размер тела ответа)

Сколько байт в теле ответа:

@RestController
public class ContentLengthExample {
    @GetMapping("/file")
    public ResponseEntity<byte[]> downloadFile() throws IOException {
        byte[] fileContent = Files.readAllBytes(Paths.get("file.pdf"));
        
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_PDF);
        // Автоматически сетится Spring, но можно явно
        headers.setContentLength(fileContent.length);
        headers.set(HttpHeaders.CONTENT_DISPOSITION, 
                   "attachment; filename=file.pdf");
        
        return new ResponseEntity<>(fileContent, headers);
    }
}

10. Content-Disposition (как обработать контент)

Показать в браузере или скачать:

@RestController
public class ContentDispositionExample {
    // Показать в браузере
    @GetMapping("/image")
    public ResponseEntity<byte[]> viewImage() throws IOException {
        byte[] imageContent = Files.readAllBytes(Paths.get("image.jpg"));
        
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.IMAGE_JPEG);
        headers.set(HttpHeaders.CONTENT_DISPOSITION, "inline");
        
        return new ResponseEntity<>(imageContent, headers);
    }
    
    // Скачать файл
    @GetMapping("/download")
    public ResponseEntity<byte[]> downloadFile() throws IOException {
        byte[] fileContent = Files.readAllBytes(Paths.get("document.pdf"));
        
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_PDF);
        headers.set(HttpHeaders.CONTENT_DISPOSITION, 
                   "attachment; filename=document.pdf");
        headers.set(HttpHeaders.CONTENT_DISPOSITION,
                   "attachment; filename*=UTF-8''document.pdf"); // Для Unicode имён
        
        return new ResponseEntity<>(fileContent, headers);
    }
}

11. Варианты Content-Type

@RestController
public class ContentTypeVariationsExample {
    // RESTful API
    @GetMapping("/users")
    public ResponseEntity<User> getUser() {
        // application/json
        return ResponseEntity.ok(new User());
    }
    
    // HAL JSON (с ссылками)
    @GetMapping("/hal-users")
    public ResponseEntity<EntityModel<User>> getHalUser() {
        // application/hal+json
        User user = new User();
        EntityModel<User> model = EntityModel.of(user,
            linkTo(methodOn(ContentTypeVariationsExample.class).getUser())
                .withSelfRel());
        return ResponseEntity.ok()
            .contentType(MediaType.valueOf("application/hal+json"))
            .body(model);
    }
    
    // JSON:API (стандартизированный формат)
    @GetMapping("/api-users")
    public ResponseEntity<String> getApiUser() {
        // application/vnd.api+json
        return ResponseEntity.ok()
            .contentType(MediaType.valueOf("application/vnd.api+json"))
            .body("{\"data\":{\"type\":\"users\",\"id\":\"1\"}}");
    }
    
    // GraphQL
    @PostMapping("/graphql")
    public ResponseEntity<String> graphql(@RequestBody String query) {
        // application/graphql
        return ResponseEntity.ok().body("{\"data\":{}}");
    }
}

Практический пример с curl

# Простой GET с указанием Accept
curl -H "Accept: application/json" http://localhost:8080/api/users

# POST с JSON и явным Content-Type
curl -X POST http://localhost:8080/api/users \
  -H "Content-Type: application/json" \
  -d '{"name":"John","age":30}'

# Загрузка файла
curl -X POST http://localhost:8080/upload \
  -H "Content-Type: multipart/form-data" \
  -F "file=@/path/to/file.txt"

# Просмотр всех заголовков
curl -i http://localhost:8080/api/users

# Запрос с Accept-Encoding для сжатия
curl -H "Accept-Encoding: gzip" http://localhost:8080/api/data

Лучшие практики

  1. Всегда указывай Content-Type — клиент должен знать какой формат
  2. Поддерживай Accept заголовок — respect клиентские предпочтения
  3. Используй UTF-8 — универсальная кодировка
  4. Сжимай большие данные — gzip для уменьшения трафика
  5. Правильно сетируй Content-Disposition — для скачиваний файлов
  6. Content-Length важен — помогает браузеру отслеживать прогресс
  7. Документируй форматы — OpenAPI/Swagger spec для API

Итог: Правильное использование HTTP заголовков критично для обмена данными и обеспечивает лучшую совместимость и производительность.