Розробка JSON-RPC API для веб-застосунку

Наша компанія займається розробкою, підтримкою та обслуговуванням сайтів будь-якої складності. Від простих односторінкових сайтів до масштабних кластерних систем, побудованих на мікро сервісах. Досвід розробників підтверджено сертифікатами від вендорів.
Розробка та обслуговування будь-яких видів сайтів:
Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Пропоновані послуги
Показано 1 з 1 послугУсі 2065 послуг
Розробка JSON-RPC API для веб-застосунку
Середня
~2-3 робочих дні
Часті питання
Наші компетенції:
Етапи розробки
Останні роботи
  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    874
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851

Розробка JSON-RPC API для веб-додатку

JSON-RPC—простий протокол віддаленого виклику процедур з використанням JSON. Версія 2.0—поточний стандарт. На відміну від REST, нема концепції ресурсів—тільки методи та параметри. Популярний у блокчейн-екосистемі (Ethereum JSON-RPC, Bitcoin RPC), мовних серверах (LSP), деяких платіжних API.

Специфікація JSON-RPC 2.0

Запит:

{
  "jsonrpc": "2.0",
  "method": "user.getById",
  "params": { "id": 42 },
  "id": 1
}

Успішна відповідь:

{
  "jsonrpc": "2.0",
  "result": { "id": 42, "name": "Іван Петров", "email": "[email protected]" },
  "id": 1
}

Помилка:

{
  "jsonrpc": "2.0",
  "error": { "code": -32602, "message": "Invalid params", "data": { "field": "id" } },
  "id": 1
}

Notification (без id—відповідь не потрібна):

{ "jsonrpc": "2.0", "method": "log.event", "params": { "type": "page_view" } }

Batch (кілька запитів в одному HTTP-запиті):

[
  { "jsonrpc": "2.0", "method": "user.get", "params": { "id": 1 }, "id": 1 },
  { "jsonrpc": "2.0", "method": "user.get", "params": { "id": 2 }, "id": 2 }
]

Коди помилок

Стандартні коди з специфікації:

Код Значення
-32700 Parse error—невалідний JSON
-32600 Invalid Request—неверний об'єкт запиту
-32601 Method not found
-32602 Invalid params
-32603 Internal error
-32000 до -32099 Серверні помилки (визначені реалізацією)

Реалізація сервера (Node.js)

import express from 'express';

const methods: Record<string, (params: any, ctx: Context) => Promise<any>> = {
  'user.getById': async ({ id }, ctx) => {
    const user = await ctx.db.user.findUnique({ where: { id } });
    if (!user) throw { code: -32000, message: 'User not found' };
    return user;
  },

  'user.create': async ({ name, email }, ctx) => {
    if (!ctx.user) throw { code: -32001, message: 'Unauthorized' };
    return ctx.db.user.create({ data: { name, email } });
  },
};

app.post('/rpc', async (req, res) => {
  const requests = Array.isArray(req.body) ? req.body : [req.body];

  const responses = await Promise.all(requests.map(async (request) => {
    const { jsonrpc, method, params, id } = request;

    if (jsonrpc !== '2.0') {
      return id != null
        ? { jsonrpc: '2.0', error: { code: -32600, message: 'Invalid Request' }, id }
        : null;
    }

    const handler = methods[method];
    if (!handler) {
      return id != null
        ? { jsonrpc: '2.0', error: { code: -32601, message: 'Method not found' }, id }
        : null;
    }

    try {
      const result = await handler(params, { db, user: req.user });
      return id != null ? { jsonrpc: '2.0', result, id } : null;
    } catch (error) {
      return id != null
        ? { jsonrpc: '2.0', error: { code: error.code || -32603, message: error.message }, id }
        : null;
    }
  }));

  res.json(responses.filter(r => r != null));
});

Коли використовувати JSON-RPC

Ідеально для: блокчейн/крипто API, мовних серверів, простої внутрішньої microservice комунікації. Не підходить для: публічних API, що вимагають семантики ресурсів, браузерних клієнтів, що очікують REST конвенцій.

Терміни

Базовий JSON-RPC сервер (10–15 методів): 2–3 дні. Зі стримингом, батчингом, розширеною обробкою помилок: 4–5 днів.