6.1 KiB
API для разработчиков: Общий формат запросов и ответов
Этот файл описывает не конкретные операции, а общий wire-контракт всего API сервера.
Здесь зафиксировано:
- как выглядит любой запрос;
- как выглядит любой успешный ответ;
- как выглядит любой ответ с ошибкой;
- какие поля являются обязательными для всех операций;
- как клиент должен интерпретировать
status,okиpayload.
Логика простая: сначала клиент и сервер договариваются о едином формате конверта, и только потом в остальных документах уже описываются конкретные методы и их поля.
1. Общий формат запроса
Все запросы по WebSocket используют один и тот же JSON-конверт:
{
"op": "OperationName",
"requestId": "req-001",
"payload": {
}
}
Поля
op— имя операции.requestId— клиентский идентификатор запроса.payload— объект параметров операции.
2. Общий формат успешного ответа
{
"op": "OperationName",
"requestId": "req-001",
"status": 200,
"ok": true,
"payload": {
}
}
3. Общий формат ответа с ошибкой
{
"op": "OperationName",
"requestId": "req-001",
"status": 400,
"ok": false,
"error": "BAD_REQUEST",
"message": "Human readable description",
"payload": {
}
}
4. Обязательные правила
- Сервер возвращает
opв каждом ответе. - Сервер возвращает
requestIdв каждом ответе без изменений. - Сервер возвращает
statusв каждом ответе. - Сервер возвращает
okв каждом ответе. - Сервер всегда возвращает
payloadкак объект. - Даже при отсутствии данных сервер возвращает
payload: {}. okнаходится на верхнем уровне ответа, а не внутриpayload.
5. Правило интерпретации
Источник истины — status.
- если
statusв диапазоне200..299, то ответ успешный иokдолжен бытьtrue; - если
statusвне диапазона200..299, то ответ ошибочный иokдолжен бытьfalse.
Запрещённые состояния:
status = 200иok = false;status = 400иok = true.
6. Общие правила формата
- Все строки подписи и challenge собираются в UTF-8.
- Временные метки передаются как Unix time в миллисекундах.
- Бинарные поля передаются строками Base64.
- При ошибке
error— это машинный код причины. - При ошибке
message— человекочитаемое описание причины.
7. Общие коды ошибок
Ниже перечислены коды ошибок, которые не привязаны к одной конкретной операции и могут встречаться в разных местах API.
400 / EMPTY_JSON— клиент отправил пустое или полностью отсутствующее JSON-сообщение.400 / NO_OP— в корневом объекте не передано полеop.400 / UNKNOWN_OP— сервер не знает такую операцию.400 / NO_PAYLOAD— в корневом объекте отсутствуетpayload.400 / BAD_PAYLOAD—payloadпередан, но это не JSON-объект.400 / BAD_REQUEST_FORMAT— JSON-конверт формально валиден, но поля операции не удалось распарсить в ожидаемый формат.500 / INTERNAL_HANDLER_ERROR— в handler конкретной операции случилась непредвиденная серверная ошибка.500 / INTERNAL_ERROR— произошла внутренняя ошибка на уровне общего JSON-процессора или другого серверного слоя.
Общее правило для dev/test этапа:
messageв таких ошибках должен быть коротким, но полезным;- по возможности сервер добавляет тип исключения и краткую деталь причины;
- это сделано для упрощения интеграционных тестов и отладки;
- позже для production этот уровень детализации может быть уменьшен.
8. Источник истины по списку операций
Фактический список публичных WebSocket-операций берётся из:
shine-server-net-protocol/src/main/java/server/logic/ws_protocol/JSON/JsonHandlerRegistry.java.
Если операция зарегистрирована в HANDLERS и REQUEST_TYPES, она считается доступной через JSON/WebSocket API. Общий актуальный индекс таких операций поддерживается в Dev_Docs/API/09_Operations_Index.md.
9. Короткое резюме
- Запросы всегда идут как
op + requestId + payload. - Ответы всегда идут как
op + requestId + status + ok + payload. - Ошибки всегда возвращают
ok: false,error,message,payload: {}.