Смешивание веб-сокетов и REST

Я пишу API RESTfull, где, например, пользователь может создавать новые потоки или новые сообщения в потоке. Здесь я бы использовал обычный запрос POST. Мой API также позволяет пользователям отправлять сообщения друг другу. И когда пользователь получает сообщение «Я хочу уведомление в браузере», я бы использовал веб-сокеты вместо опроса каждые несколько секунд.

Мои вопросы

  • Поскольку у меня уже есть открытое соединение с веб-сокетом, куда будут приходить сообщения, должен ли я также использовать это соединение для отправки сообщений, создания новых тем или сообщений?

  • Могу ли я использовать POST-запрос для создания сообщений и веб-сокеты для их получения в режиме реального времени и GET-запрос для получения истории сообщений? Это хорошая практика?

  • Я использую django rest framework, который обрабатывает для меня проверку полей, как мне обрабатывать проверку, если я создаю ресурс с использованием веб-сокета вместо обычного запроса POST.

Я новичок в разработке RESTfull API, и я только начал разрабатывать веб-сокеты. Извините за глупые вопросы, которые могут показаться вам такими логичными :)

Спасибо


person Blake Gibbs    schedule 03.02.2017    source источник


Ответы (2)


Поскольку у меня уже есть открытое соединение с веб-сокетом, куда будут приходить сообщения, должен ли я также использовать это соединение для отправки сообщений, создания новых тем или сообщений?

Это зависит. Вы хотите использовать обычный HTTP POST, если вы используете подход CQRS, и ваши записи обрабатываются другими блоками, чем ваши чтения; или если вам нужно обеспечить совместимость для внешних вызывающих объектов, которые могут не поддерживать WebSockets.

Могу ли я использовать POST-запрос для создания сообщений и веб-сокеты для их получения в режиме реального времени и GET-запрос для получения истории сообщений? Это хорошая практика?

Звучит разумно. Вы получите совместимость с REST и WebSocket в качестве улучшения. Что я делаю, так это использую WebSockets для улучшения REST API. Некоторые операции находятся в обеих частях, например «автозаполнение», которое по сути представляет собой быструю последовательность вызовов и относится к модели чтения, может выполняться в обоих направлениях, однако недостатком является то, что я не могу использовать преимущества встроенного кэша вывода, и мне приходится реализовать для них собственный кеш.

Я использую django rest framework, который обрабатывает для меня проверку полей, как мне обрабатывать проверку, если я создаю ресурс с использованием веб-сокета вместо обычного запроса POST.

Я не использую django, но я думаю, вы можете как-то подключиться к этой проверке самостоятельно и вызвать ее в своем объекте сообщения после десериализации.

person vtortola    schedule 06.02.2017

Что касается вашего третьего вопроса, самое простое решение будет выглядеть так:

def ws_create_item(message):
    data = json.loads(message['text'])
    serializer = ItemSerializer(data=data)
    if serializer.is_valid():
        serializer.save()

Где ItemSerializer — это обычный сериализатор DRF, а ws_create_item — принимающий потребитель WebSocket.

person Irina Velikopolskaya    schedule 07.02.2017