Какие знаешь заголовки http которые отвечают за формат?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
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
Лучшие практики
- Всегда указывай Content-Type — клиент должен знать какой формат
- Поддерживай Accept заголовок — respect клиентские предпочтения
- Используй UTF-8 — универсальная кодировка
- Сжимай большие данные — gzip для уменьшения трафика
- Правильно сетируй Content-Disposition — для скачиваний файлов
- Content-Length важен — помогает браузеру отслеживать прогресс
- Документируй форматы — OpenAPI/Swagger spec для API
Итог: Правильное использование HTTP заголовков критично для обмена данными и обеспечивает лучшую совместимость и производительность.