混合使用Websockets和REST

6
我正在编写一个RESTful API,在这个API中,用户可以创建新的主题或在主题中发表新的帖子。我将使用普通的POST请求来完成这些操作。我的API还允许用户相互发送消息。当用户收到消息时,我希望浏览器能够得到通知,这时应该使用Websockets而不是每隔几秒钟轮询。

我的问题有:

  • 由于已经通过websocket建立了开放连接,消息会通过这个连接传输,那么我是否也应该使用此连接发送消息、创建新的主题或帖子?

  • 我可以使用POST请求来创建新的消息,并使用WebSocket实时接收消息和GET请求获取消息历史记录吗?这种做法合适吗?

  • 我正在使用Django REST框架,它可以为我处理字段验证,如果我使用WebSocket而不是普通的POST请求创建资源,则如何处理验证?

我对于RESTful API的开发还比较新手,而且我只是刚开始使用WebSocket进行开发,请见谅我的一些愚蠢问题 :)

谢谢!

2个回答

0
由于我已经与websocket建立了开放连接,消息将会到来,那么我是否应该使用这个连接来发送消息、创建新的线程或者发布文章呢?
这取决于情况。如果你正在使用CQRS方法,并且你的写操作由不同的盒子处理,而读操作则由其他盒子处理;或者你必须为可能不支持WebSockets的外部调用者提供兼容性,则应使用常规的HTTP POST。
我可以使用POST请求来创建消息和使用WebSockets实时接收它们,使用GET请求来获取消息历史记录吗?这是一个好的做法吗?
这听起来很合理。您将获得REST兼容性和WebSocket作为增强功能。我的做法是使用WebSockets来增强REST API。有些操作在两个部分中都存在,例如“自动完成”,它们本质上是一系列快速调用,并属于读模型,可以通过两种方式完成,但缺点是我无法利用内置输出缓存,必须为它们实现自己的缓存。
我正在使用django rest框架,它为我处理字段验证,如果我使用websocket而不是普通的POST请求创建资源,我该如何处理验证呢?

我不做Django,但我猜你可以在反序列化后自己钩入验证,并在消息对象中调用它。


0
关于您的第三个问题,最基本的解决方案看起来像是:
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 消费者。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接