Метод receive_json
Метод receive_json применяется к объекту
WebSocket
и читает входящее сообщение, которое клиент
отправил в формате JSON. Метод возвращает
результат разбора JSON: словарь, список, строку,
число, логическое значение или None.
Если клиент прислал невалидный JSON,
метод выбрасывает исключение.
Синтаксис
await websocket.receive_json()
Пример
Давайте создадим WebSocket-маршрут, который
принимает JSON-объект и возвращает его поле
name:
from fastapi import FastAPI, WebSocket
app = FastAPI()
@app.websocket('/ws')
async def websocket_endpoint(websocket: WebSocket):
await websocket.accept()
data = await websocket.receive_json()
await websocket.send_text(data['name'])
await websocket.close()
Запустим сервер:
uvicorn main:app --reload
Если клиент отправит сообщение '{"name": "abcde"}',
то в ответ получит строку:
"abcde"
Пример
Давайте примем JSON-массив и вернём его в обратном порядке:
from fastapi import FastAPI, WebSocket
app = FastAPI()
@app.websocket('/ws')
async def websocket_endpoint(websocket: WebSocket):
await websocket.accept()
data = await websocket.receive_json()
res = list(reversed(data))
await websocket.send_json(res)
await websocket.close()
Если клиент отправит сообщение '[1, 2, 3, 4, 5]',
то в ответ получит JSON-массив:
[5, 4, 3, 2, 1]
Пример
Давайте обработаем несколько JSON-сообщений
в цикле, пока клиент не отправит команду
stop:
from fastapi import FastAPI, WebSocket
app = FastAPI()
@app.websocket('/ws')
async def websocket_endpoint(websocket: WebSocket):
await websocket.accept()
while True:
data = await websocket.receive_json()
if data['command'] == 'stop':
break
await websocket.send_json({'echo': data['command']})
await websocket.close()
Если клиент отправит сообщение
'{"command": "hello"}',
то в ответ получит JSON-объект:
{"echo": "hello"}
Смотрите также
-
класс
WebSocket,
который представляет WebSocket-соединение -
метод
receive_text,
который принимает текстовое сообщение -
метод
receive_bytes,
который принимает бинарное сообщение -
метод
send_json,
который отправляет JSON-сообщение клиенту