【问题标题】:Mixing Websockets and REST混合 Websocket 和 REST
【发布时间】:2017-06-20 10:46:26
【问题描述】:
我正在编写一个 RESTfull api,例如,用户可以在其中创建新线程或线程中的新帖子。这是我使用普通 POST 请求的地方。我的 API 还允许用户互相发送消息。当用户在浏览器中收到我想要通知的消息时,我会使用 websockets 而不是每隔几秒轮询一次。
我的问题是
既然我已经与 websocket 建立了开放的连接,消息将传来,我是否也应该使用这个连接来发送消息、创建新线程或帖子?
我可以使用 POST 请求来创建消息,使用 websockets 来实时接收它们,并使用 GET 请求来获取消息历史记录吗?这是一种好的做法吗?
我正在使用 django rest 框架,它为我处理字段验证,如果我使用 websocket 而不是普通的 POST 请求创建资源,我将如何处理验证。
我在开发 RESTfull API 方面非常陌生,而且我才开始使用 websockets 进行开发。对于任何对您来说似乎很合乎逻辑的愚蠢问题,我们深表歉意:)
谢谢
【问题讨论】:
标签:
django
websocket
django-rest-framework
django-channels
【解决方案1】:
因为我已经打开了与 websocket 的连接,其中消息
会来的,我是不是也用这个连接发消息,创建
新话题或帖子?
这取决于。如果您使用 CQRS 方法并且您的写入由与读取不同的框处理,则您希望使用常规 HTTP POST;或者如果您必须为可能不支持 WebSockets 的外部调用者提供兼容性。
我可以使用 POST 请求来创建消息和 websockets 来接收吗
他们实时和GET请求以获取消息历史记录?这是
好的做法?
听起来很合理。您将获得 REST 兼容性和 WebSocket 作为增强功能。我所做的是使用 WebSockets 来增强 REST API。一些操作在这两个部分中,例如“自动完成”本质上是一个快速连续的调用并且属于读取模型可以通过两种方式完成,但是缺点是我不能利用内置的输出缓存,我必须为他们实现我自己的缓存。
我正在使用 django rest 框架,它处理字段的验证
对我来说,如果我使用创建资源,我将如何处理验证
websocket 而不是普通的 POST 请求。
我不使用 django,但我想您可以通过某种方式自己挂钩该验证,并在反序列化后在您的消息对象中调用它。
【解决方案2】:
关于您的第三个问题,最基本的解决方案如下所示
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 使用者。