在 websocket app 中使用 gin-like API 处理请求

2023-02-06 16:30:15 +08:00
 Nazz

连续肝了几天, 厚着脸皮再发一次. 目前测试覆盖率已经到达了 95%, 欢迎大家 star, issue 和 PR

项目地址: https://github.com/lxzan/uRouter

express, koa, gin 致敬!

特性

Demo

package main

import (
	"github.com/lxzan/gws"
	"github.com/lxzan/uRouter"
	gwsAdapter "github.com/lxzan/uRouter/contrib/adapter/gws"
	httpAdapter "github.com/lxzan/uRouter/contrib/adapter/http"
	"log"
	"net/http"
)

func main() {
	var router = uRouter.New()
	router.Use(uRouter.Recovery(), uRouter.AccessLog())

	var upgrader = gws.NewUpgrader(func(c *gws.Upgrader) {
		c.EventHandler = NewWebSocketHandler(router, gwsAdapter.NewAdapter(router))
	})

	router.On("/connect", func(ctx *uRouter.Context) {
		r := ctx.Request.Raw
		w := ctx.Writer.Raw()
		socket, err := upgrader.Accept(w.( http.ResponseWriter), r.(*http.Request))
		if err != nil {
			log.Println(err.Error())
			return
		}
		socket.Listen()
	})

	router.Display()
	if err := http.ListenAndServe(":3000", httpAdapter.NewAdapter(router)); err != nil {
		log.Fatalln(err.Error())
	}
}

func NewWebSocketHandler(router *uRouter.Router, adapter *gwsAdapter.Adapter) *WebSocketHandler {
	h := &WebSocketHandler{
		adapter: adapter,
		router:  router,
	}
	group := router.Group("", uRouter.Protocol(uRouter.ProtocolWebSocket))
	group.On("/greet", h.Greet)
	return h
}

type WebSocketHandler struct {
	gws.BuiltinEventEngine
	adapter *gwsAdapter.Adapter
	router  *uRouter.Router
}

func (c *WebSocketHandler) OnMessage(socket *gws.Conn, message *gws.Message) {
	if err := c.adapter.ServeWebSocket(socket, message); err != nil {
		log.Println(err.Error())
	}
}

func (c *WebSocketHandler) Greet(ctx *uRouter.Context) {
	var req = uRouter.Any{}
	if err := ctx.BindJSON(&req); err != nil {
		log.Println(err.Error())
		return
	}
	ctx.Writer.Header().Set(uRouter.ContentType, uRouter.MimeJson)
	_ = ctx.WriteJSON(int(gws.OpcodeText), req)
}
let ws = new WebSocket('ws://127.0.0.1:3000/connect')
ws.send('0019{"X-Path":"/greet"}{"hello":"你好, 少侠"}');
683 次点击
所在节点    程序员
7 条回复
learningman
2023-02-06 16:50:40 +08:00
“hashmap 实现的静态路由, 拒绝路径中夹带参数”
好像还挺自豪。。。
Nazz
2023-02-06 16:52:08 +08:00
@learningman 你以为 restful 表达能力很强性能很好吗
learningman
2023-02-06 16:59:14 +08:00
@Nazz #2 所以框架的应该教用户做事吗?
learningman
2023-02-06 17:01:02 +08:00
@Nazz #2 字典树肯定没 hashmap 跑的快啊,但还是那句话,框架应该教用户做事吗?
Nazz
2023-02-06 17:09:02 +08:00
@learningman 每个项目都会有作者的个人风格. 我认为, 对于 api server, JSON-RPC 抽象比 RESTful 好得多
Nazz
2023-02-06 17:09:49 +08:00
@learningman 用户有选择自己喜欢的库的自由
Nazz
2023-02-06 20:14:54 +08:00
@learningman 不仅仅是数据结构本身的性能,动态路由不方便做监控和日志分析

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/913673

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX