← Назад к вопросам
С какими форматами работал по REST
2.7 Senior🔥 71 комментариев
#Docker, Kubernetes и DevOps
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Форматы данных в REST API
REST (Representational State Transfer) использует различные форматы для передачи данных. Как Java разработчик, работал с основными:
1. JSON (JavaScript Object Notation)
Самый популярный формат в 2025 году.
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.annotation.JsonProperty;
public class User {
@JsonProperty("user_id")
private int id;
@JsonProperty("full_name")
private String name;
private String email;
}
// Сериализация: объект → JSON
ObjectMapper mapper = new ObjectMapper();
User user = new User(1, "John Doe", "john@example.com");
String json = mapper.writeValueAsString(user);
// {"user_id":1,"full_name":"John Doe","email":"john@example.com"}
// Десериализация: JSON → объект
String jsonString = "{\"user_id\":1,\"full_name\":\"John Doe\"}";
User parsedUser = mapper.readValue(jsonString, User.class);
Преимущества:
- Лёгкий и читаемый
- Универсальная поддержка во всех языках
- Быстрый парсинг
Недостатки:
- Больше данных чем бинарные форматы
- Не поддерживает сложные типы (например, Date без преобразований)
2. XML (eXtensible Markup Language)
Использовался в SOAP, некоторые REST API.
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlElement;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
@JacksonXmlRootElement(localName = "user")
public class UserXml {
@JacksonXmlProperty
private int id;
@JacksonXmlProperty
private String name;
}
// Jackson для XML
XmlMapper xmlMapper = new XmlMapper();
String xml = xmlMapper.writeValueAsString(user);
// <user><id>1</id><name>John Doe</name></user>
UserXml parsed = xmlMapper.readValue(xml, UserXml.class);
Преимущества:
- Расширяемый
- Поддерживает валидацию через XSD
- Хорош для документов
Недостатки:
- Очень многословный
- Медленнее парсится чем JSON
- Редко используется в новых REST API
3. Protocol Buffers (protobuf)
Бинарный формат от Google, для высокопроизводительных систем.
// user.proto
syntax = "proto3";
message User {
int32 id = 1;
string name = 2;
string email = 3;
}
import com.example.UserProto.User;
// Сериализация
User user = User.newBuilder()
.setId(1)
.setName("John Doe")
.setEmail("john@example.com")
.build();
byte[] serialized = user.toByteArray(); // Бинарные данные
// Десериализация
User parsed = User.parseFrom(serialized);
Преимущества:
- Очень компактный (меньше данных)
- Быстрая сериализация/десериализация
- Строгая схема
Недостатки:
- Не человекочитаемый
- Требует генерации кода
- gRPC нужен для полноценного использования
4. Form Data (Application/x-www-form-urlencoded)
Для HTML форм и простых параметров.
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
@PostMapping("/login")
public ResponseEntity<?> login(
@RequestParam String username,
@RequestParam String password) {
// username=john&password=secret
return ResponseEntity.ok("Logged in");
}
Использование:
curl -X POST http://api.example.com/login \
-d "username=john&password=secret"
Преимущества:
- Простой
- Поддерживается везде
- Подходит для простых форм
Недостатки:
- Нет поддержки вложенных структур
- Не подходит для сложных объектов
5. Multipart/Form-Data
Для загрузки файлов.
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.multipart.MultipartFile;
@PostMapping("/upload")
public ResponseEntity<?> uploadFile(
@RequestParam("file") MultipartFile file,
@RequestParam("description") String description) {
String filename = file.getOriginalFilename();
long size = file.getSize();
byte[] content = file.getBytes();
// Сохраняем файл
saveFile(filename, content);
return ResponseEntity.ok("File uploaded");
}
Использование:
curl -X POST http://api.example.com/upload \
-F "file=@photo.jpg" \
-F "description=My photo"
6. GraphQL (квази-REST формат)
Альтернатива REST, более гибкая.
import graphql.GraphQL;
import graphql.schema.GraphQLSchema;
// GraphQL запрос
String query = """
query {
user(id: 1) {
id
name
email
}
}
""";
// GraphQL ответ — всё ещё JSON!
// {
// "data": {
// "user": {
// "id": 1,
// "name": "John Doe",
// "email": "john@example.com"
// }
// }
// }
Сравнение форматов
┌──────────────┬──────────┬────────────┬─────────┬──────────┐
│ Формат │ Размер │ Скорость │ Читаемо │ Сложность│
├──────────────┼──────────┼────────────┼─────────┼──────────┤
│ JSON │ Средний │ Быстро │ Да │ Низкая │
│ XML │ Большой │ Медленно │ Да │ Средняя │
│ Protobuf │ Малый │ Очень быстр│ Нет │ Высокая │
│ Form Data │ Малый │ Быстро │ Да │ Низкая │
│ Multipart │ Переменный│ Медленно │ Нет │ Средняя │
└──────────────┴──────────┴────────────┴─────────┴──────────┘
Практический пример: REST контроллер с разными форматами
import org.springframework.web.bind.annotation.*;
import org.springframework.http.MediaType;
@RestController
@RequestMapping("/api/users")
public class UserController {
// JSON (по умолчанию в REST)
@GetMapping("/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
public User getUserAsJson(@PathVariable int id) {
return userService.findById(id);
}
// XML
@GetMapping("/{id}", produces = MediaType.APPLICATION_XML_VALUE)
public User getUserAsXml(@PathVariable int id) {
return userService.findById(id);
}
// Принимаем JSON, возвращаем JSON
@PostMapping(consumes = MediaType.APPLICATION_JSON_VALUE,
produces = MediaType.APPLICATION_JSON_VALUE)
public User createUser(@RequestBody User user) {
return userService.save(user);
}
}
Ключевые выводы
- JSON — стандарт де-факто для REST API в 2025
- XML — считается устаревшим, встречается в legacy системах
- Protobuf — для микросервисов и gRPC (высокопроизводительность)
- Form Data — для простых форм и параметров
- Multipart — для загрузки файлов
- Выбирай формат в зависимости от задачи — JSON для большинства случаев