前言
众所周知,用http可以实现从客户端请求服务端的消息,用websocket可以实现客户端和服务器的双向通信,但用SSE实现服务端主动推送的比较少。
SSE相当于http的优点是可以由服务端主动推送消息。SSE相当于websocket的优点是断开连接后可以自动重连。
使用场景
- 消息统一推送
- 数据实时更新
- 代替轮询
使用方法
node的话,可以用阮老师的例子node实现SSE
python可以参考下面的代码
from flask import Flask, Response
import time
import json
app = Flask(__name__)
def message_to_send():
time.sleep(5)
return json.dumps({"message": "hello"})
@app.route("/stream")
def stream():
def event_stream():
while True:
print("send")
yield "data: {}\n\n".format(message_to_send())
return Response(
event_stream(),
mimetype="text/event-stream",
headers={"Access-Control-Allow-Origin": "*"},
)
if __name__ == "__main__":
app.run()
传递post参数
默认情况下,sse
只能进行get
请求,参数跟在url后面。借助@microsoft/fetch-event-source
可以传递post参数。
fetchEventSource('/api/sse', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
foo: 'bar'
}),
});
注意事项
- 想要跨域需要设置
withCredentials: true
或服务端设置允许跨域。(@microsoft/fetch-event-source
可以不用设置) - 需要设置
mimetype
为text/event-stream
- 有连接个数限制,每个域名下好像是限制6个
- 如果想测试自动重连,可以先关闭服务端的服务再打开
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。