Bosh sahifa Wiki JSON-RPC

JSON-RPC

JSON-RPCJSON formatida remote procedure call request va response’larini ifodalovchi yengil protocol. U clientga method nomi va parameterlarni yuborish, serverga esa natija yoki structured error qaytarish modelini beradi.

JSON-RPC transportdan mustaqil. U HTTP, WebSocket, Unix socket yoki boshqa channel orqali uzatilishi mumkin.

Request object

Oddiy request quyidagi maydonlarga ega:

{
  "jsonrpc": "2.0",
  "method": "user.get",
  "params": {
    "id": 15
  },
  "id": 1
}

jsonrpc protocol versiyasini, method chaqiriladigan operationni, params argumentlarni, id esa response correlationni belgilaydi.

Version

JSON-RPC 2.0 requestda:

"jsonrpc": "2.0"

maydoni bo‘lishini talab qiladi.

Client va server protocol versiyasini aniq tekshiradi.

Eski 1.0 behaviori bilan aralashish interoperability muammosi yaratishi mumkin.

Method

method string ko‘rinishidagi procedure nomi.

Masalan:

  • user.get;
  • order.create;
  • system.status;
  • math.sum.

Method naming namespacega o‘xshash convention bilan tashkil qilinishi mumkin.

Har method authorization va input validationga ega.

Params

Parameterlar:

  • positional array;
  • named object

ko‘rinishida yuborilishi mumkin.

Masalan:

"params": [4, 7]

yoki:

"params": {
  "a": 4,
  "b": 7
}

Server method contractiga mos type va required fieldlarni tekshiradi.

ID

id request va response’ni bog‘laydi.

U string, number yoki protocol ruxsat bergan boshqa qiymat bo‘lishi mumkin.

Server response’da ayni IDni qaytaradi.

Parallel requestlar natijasi shu orqali ajratiladi.

Response

Muvaffaqiyatli response:

{
  "jsonrpc": "2.0",
  "result": {
    "id": 15,
    "name": "Farrukh"
  },
  "id": 1
}

result va error bir response’da birga bo‘lmaydi.

Error object

Xato response:

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

Error qo‘shimcha data maydoniga ega bo‘lishi mumkin.

Ichki stack trace tashqi clientga yuborilmaydi.

Standard xatolar

JSON-RPC 2.0 ayrim standard error code’larni belgilaydi:

  • Parse error;
  • Invalid Request;
  • Method not found;
  • Invalid params;
  • Internal error.

Server-specific errorlar alohida diapazonda berilishi mumkin.

Client code va semantic mappingni biladi.

Notification

id maydoni bo‘lmagan request notification hisoblanadi.

Server unga response qaytarmaydi.

Misol:

{
  "jsonrpc": "2.0",
  "method": "event.track",
  "params": {
    "name": "page_open"
  }
}

Delivery yoki server xatosi clientga bevosita ma’lum bo‘lmaydi.

Batch request

Client bir array ichida bir nechta request va notification yuborishi mumkin.

Server tegishli response’larni array ko‘rinishida qaytaradi.

Response tartibi request tartibiga aynan mos bo‘lishi shart emas.

IDlar correlation uchun ishlatiladi.

Transport

HTTP ishlatilganda ko‘pincha bitta endpointga POST yuboriladi.

WebSocket uzoq connection va serverdan clientga RPCga o‘xshash interactionni qo‘llashi mumkin.

Protocol transport authentication, timeout va framingni o‘zi to‘liq belgilamaydi.

HTTP status

JSON-RPC application errori HTTP 200 ichida error object bilan qaytishi mumkin.

Transport yoki gateway xatosi esa 4xx/5xx bo‘lishi ehtimoli bor.

Client HTTP status va JSON-RPC errorni alohida ko‘rib chiqadi.

Schema

JSON-RPCning o‘zi method parameter type’larini formal schema bilan majburiy belgilamaydi.

Documentation, JSON Schema yoki code generationga oid qo‘shimcha tizim ishlatilishi mumkin.

Contract noaniq bo‘lsa runtime xatolar ko‘payadi.

Authentication

Authentication transport qatlamida token, cookie, mTLS yoki boshqa usul bilan bajarilishi mumkin.

Method parameter ichida parol yuborish transport xavfsizligini almashtirmaydi.

Authorization har method va resource uchun tekshiriladi.

Idempotency

Request timeoutdan keyin qayta yuborilishi mumkin.

Read methodlar odatda xavfsizroq.

Create yoki payment operationlari idempotency key yoki unique request ID talab qiladi.

JSON-RPC id maydoni o‘zi business idempotency kafolati emas.

Method enumeration

Method not found xabari mavjud methodlarni bevosita ko‘rsatmasa ham bruteforce orqali interface taxmin qilinishi mumkin.

Security faqat method nomini yashirishga tayanmaydi.

Authentication va authorization asosiy control.

JSON-RPC va REST

JSON-RPC operation markazli:

method + params

REST resource va HTTP method semantikasiga tayanadi.

JSON-RPC bitta endpoint va aniq commandlar uchun sodda.

REST HTTP cache, status va resource URLdan keng foydalanadi.

JSON-RPC va gRPC

JSON-RPC text JSON va yengil specificationga ega.

gRPC typed IDL, code generation, binary Protobuf va streaming imkoniyatlarini beradi.

JSON-RPC browser va debuggingda sodda, gRPC esa high-performance service communication uchun kuchliroq bo‘lishi mumkin.

Parallel chaqiriq

WebSocket kabi transportda ko‘p request bir vaqtda yuboriladi va response boshqa tartibda kelishi mumkin. Client id bo‘yicha pending Promise yoki callbackni topadi. Duplicate yoki noma’lum ID protocol xatosi sifatida log qilinadi.

Method allowlist

Server method nomini dynamic reflection bilan istalgan application functionga bog‘lamaydi. Faqat explicit ro‘yxatdan o‘tgan handlerlar chaqiriladi. Private yoki internal method client yuborgan string orqali ochilib ketmasligi kerak.

Rate va complexity

Bitta batch ichida minglab qimmat method yuborilishi mumkin. Batch item soni, payload hajmi va har method costi cheklanadi. Notification response bermasa ham server resource sarflaydi.

Transport framing

TCP streamda JSON object chegarasi o‘z-o‘zidan ma’lum emas. Har message newline, length prefix yoki WebSocket frame bilan ajratiladi. Faqat } belgisiga qarab bo‘lish nested object va stringlarda noto‘g‘ri ishlaydi.

Bog‘liq tushunchalar

JSON-RPC, JSON, Remote Procedure Call, Request ID, Notification, Batch request, RPC error, HTTP API, WebSocket, Idempotency