JSON-RPC
JSON-RPC 2.0 — простой RPC-протокол на JSON. Один эндпоинт, вызов методов по имени. Проще REST, старше GraphQL. Популярен в криптоблокчейне (Ethereum, Bitcoin) и внутренних API.
Запрос
{
"jsonrpc": "2.0",
"method": "user.get",
"params": {"id": 42},
"id": 1
}
Ответ (успех)
{
"jsonrpc": "2.0",
"result": {"id": 42, "name": "Vasya"},
"id": 1
}
Ответ (ошибка)
{
"jsonrpc": "2.0",
"error": {
"code": -32601,
"message": "Method not found"
},
"id": 1
}
Standard error codes
| Code | Что |
|---|---|
| -32700 | Parse error (не JSON) |
| -32600 | Invalid Request |
| -32601 | Method not found |
| -32602 | Invalid params |
| -32603 | Internal error |
| -32000 .. -32099 | server-defined |
Batch
# запрос
[
{"jsonrpc":"2.0","method":"a","id":1},
{"jsonrpc":"2.0","method":"b","id":2}
]
# ответ
[
{"jsonrpc":"2.0","result":"...","id":1},
{"jsonrpc":"2.0","result":"...","id":2}
]
Notifications
Запрос без id — ответа не будет (fire-and-forget). Полезно для событий.
Транспорт
Не привязан к HTTP! Работает поверх:
- HTTP POST
- WebSocket
- TCP raw
- Unix socket
- IPC
Ethereum JSON-RPC
curl -X POST https://mainnet.infura.io/v3/KEY \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
# → {"jsonrpc":"2.0","result":"0x1a3b4c5","id":1}
vs REST / GraphQL
| JSON-RPC | REST | GraphQL | |
|---|---|---|---|
| Стиль | RPC | ресурсный | query |
| URL | один | много | один |
| HTTP-коды | всегда 200 | значимы | обычно 200 |
| Простота | максимум | средне | сложно |