有时我想拒绝 http 客户端升级到 websocket 连接的请求。
代码
(使用go'sGin和gorilla/websocket框架:)
允许升级:
c, err := ctl.upgrader.Upgrade(ctx.Writer, ctx.Request, nil)
err = c.WriteJSON(resp)
拒绝升级(由于请求参数无效):
if contentId == "" || !exists {
// FIXME: provide response in a way that ws client can recognize & show tip?
ctx.String(http.StatusBadRequest, "invalid or non-existing contentId")
return
}
说明:这里拒绝升级我只是返回一个http400代码,然后终止连接,根本没有做升级。
问题
使用 about 代码拒绝 websocket 升级请求的问题是,websocket 客户端(例如js)无法在我的响应中读取数据(文本或 json) 。
代码 - 客户端( js):
ws.onerror = function (evt) {
// TOOD: handle error, (e.g print error msg?),
print("ERROR");
}
它确实打印了"ERROR"拒绝,但是在检查了有关该evt对象的 chrome 开发人员工具后,找不到获取服务器响应数据的方法,因此我无法以拒绝的原因向前端 UI 显示提示。
如何正确拒绝 websocket 升级请求,并让客户端能够接收返回的原因/数据?(例如客户端是js
,服务器是go
// gin
)gorilla/websocket
。
除了返回 http 代码之外,有没有更好的方法来拒绝 websocket 升级请求400
?
交互式爱情
相关分类