# JSON-RPC 2.0 標準結構
JSON-RPC 2.0 是一個輕量級的遠程程序呼叫 (RPC) 協議,使用 JSON 格式作為訊息交換格式。它支持單向呼叫、通知、批次請求及回應,並提供錯誤處理機制。JSON-RPC 2.0 並不限制實作細節,這讓它可以廣泛應用於不同的應用場景。
## 訊息結構
每個 JSON-RPC 訊息包含以下基本元素:
### 1. `jsonrpc`
- **類型**: 字串
- **描述**: 指定 JSON-RPC 的版本。對於所有 JSON-RPC 2.0 訊息,該字段應設為 `"2.0"`。
### 2. `method`
- **類型**: 字串
- **描述**: 要呼叫的方法名稱。這是處理請求的關鍵。
### 3. `params`
- **類型**: 陣列或物件 (可選)
- **描述**: 方法的引數。這個字段是可選的,取決於所呼叫的方法是否需要引數。若方法不需要參數,該字段可省略。
### 4. `id`
- **類型**: 整數、字串或 `null`
- **描述**: 用於標識請求的 ID。此 ID 在回應中會返回,以便與請求一一對應。若為通知型請求,該字段可省略。
## JSON-RPC 2.0 訊息類型
JSON-RPC 2.0 支援三種主要訊息類型:Request、Response 和 Error。
### Request 訊息
請求訊息由客戶端發出,要求伺服器執行某個方法。請求訊息必須包含 `jsonrpc`、`method`、`params` 和 `id`。
範例:
```json
{
"jsonrpc": "2.0",
"method": "subtract",
"params": [42, 23],
"id": 1
}
```
- **`method`**: 要呼叫的方法名稱,如 `subtract`。
- **`params`**: 呼叫方法所需的引數,這裡是 `[42, 23]`。
- **`id`**: 請求的唯一標識符,這裡是 `1`。
### Response 訊息
回應訊息由伺服器回傳,表示方法執行的結果。回應訊息包含 `jsonrpc`、`result` 和 `id`。
範例:
```json
{
"jsonrpc": "2.0",
"result": 19,
"id": 1
}
```
- **`result`**: 方法執行的結果,這裡是 `19`。
- **`id`**: 用來對應請求訊息的 ID。
### Error 訊息
錯誤訊息由伺服器回傳,表示方法執行過程中出現了錯誤。錯誤訊息包含 `jsonrpc`、`error` 和 `id`。
範例:
```json
{
"jsonrpc": "2.0",
"error": {
"code": -32602,
"message": "Invalid params"
},
"id": 1
}
```
- **`error`**: 錯誤訊息,包含錯誤代碼 `code` 和錯誤描述 `message`。
- **`code`**: `-32602` 表示參數無效。
- **`message`**: 錯誤的簡短描述,這裡是 `"Invalid params"`。
- **`id`**: 用來對應請求訊息的 ID。
## 錯誤處理
當方法執行失敗時,錯誤訊息需要包含以下字段:
### 1. `code`
- **類型**: 整數
- **描述**: 錯誤的代碼。標準錯誤代碼可以參考 [JSON-RPC 2.0 錯誤代碼](https://www.jsonrpc.org/specification#error-codes) 定義。
### 2. `message`
- **類型**: 字串
- **描述**: 錯誤的簡短描述。
### 3. `data` (可選)
- **類型**: 任意
- **描述**: 用於提供附加的錯誤訊息,這是可選的。
## 通知
通知是 JSON-RPC 2.0 的一種特殊請求形式,它不需要 `id` 欄位。這表示客戶端發送請求但不期望回應。
範例:
```json
{
"jsonrpc": "2.0",
"method": "sendMessage",
"params": ["Hello, World!"]
}
```
## 批次請求
JSON-RPC 2.0 允許在一個 HTTP 請求中包含多個 JSON-RPC 請求。這被稱為批次請求。每個請求都會有自己的 `jsonrpc`、`method`、`params` 和 `id`。伺服器會對每個請求返回獨立的回應。
範例:
```json
[
{
"jsonrpc": "2.0",
"method": "subtract",
"params": [42, 23],
"id": 1
},
{
"jsonrpc": "2.0",
"method": "add",
"params": [1, 2],
"id": 2
}
]
```
回應:
```json
[
{
"jsonrpc": "2.0",
"result": 19,
"id": 1
},
{
"jsonrpc": "2.0",
"result": 3,
"id": 2
}
]
```
## 標準錯誤代碼
JSON-RPC 2.0 定義了一些標準的錯誤代碼,這些代碼有助於識別不同類型的錯誤。以下是一些常見的錯誤代碼:
- `-32600`: 無效的請求
- `-32601`: 方法未找到
- `-32602`: 無效的參數
- `-32603`: 內部錯誤
- `-32700`: 解析錯誤
## 小結
JSON-RPC 2.0 是一個靈活且強大的 RPC 協議,廣泛應用於各種分布式系統中。它具有簡單、清晰的結構,可以輕鬆地進行擴展和調整以符合不同的需求。