0、引言
go语言已成为当今web后台开发的首选语言,关键在于其简洁性和高效并发特性。go中提供了丰富通用的http开发接口,但一般需要对其进一步封装才能更好的用于实际项目中。因此,本文基于开源库(github.com/ti/ctxrouter)来实现一种简约的web开发框架。
1、主程序,web服务的启动
import ( "net/http" "services" "errors" ) func Start() { server := services.NewServer() if err:= http.ListenAndServe(127.0.0.1:9677, server.HTTPHandler()); err != nil { panic(err) } }
其中,调用Start函数,即可启动http服务,开始监听9677端口的http请求,同时server.HTTPHandler()返回相应的http的url的路由信息。
2、Server程序,构建相应的http路由
import ( "github.com/ti/ctxrouter" "net/http" ) type Server struct { } func NewServer() *Server { server = &Server{} return server } // 构建http路由及其相应的处理器 func (this *Server) HTTPHandler() http.Handler { r := ctxrouter.New() r.Get("/prefix/model/item", (*ItemMsgContext).getItems) r.Get("/prefix/model/item/:id", (*ItemMsgContext).getItem) }
3、具体处理类及接口
import ( "github.com/ti/ctxrouter" "net/http" "encoding/json" "errors" "io/ioutil" "strings" ) // 查询数据的结构体 type ItemContent struct { ID string MsgType string Msg string } // 继承ctxrouter.Context类型,并具有相关的数据或结构体类型 type ItemMsgContext struct { ctxrouter.Context UserId string Data *ItemContent } // 初始化,从http请求中获取一些信息 func (ctx *ItemMsgContext) Init(w http.ResponseWriter, r *http.Request) { ctx.Context.Init(w, r) ctx.UserId = r.Header.Get("X-User-Id") } // 对http请求的body进行解析 func (ctx *RuleMsgContext) DecodeRequest() (interface{}, error) { if ctx.Request.Body == nil { return nil } b, err := ioutil.ReadAll(ctx.Request.Body) if len(b) > 0 { if err != nil { } ctx.Data = new(ItemContent) if ctx.Data != nil && strings.Contains(ctx.Request.Header.Get("Content-Type"), "json") { if err := json.Unmarshal(b, ctx.Data); err != nil { return errors.New("error - " + err.Error()) } itemmsg, err := json.Marshal(ctx.Data) if err != nil { return nil, err } else { return itemmsg, nil } } } return nil, nil } // 利用url中的查询条件来得到相应的参数,再据此查询数据库来得到并返回相应的数据 func (ctx *ItemMsgContext) getItems() (interface{}, error) { var msgType string query := ctx.Request.URL.Query() msgType = query.Get("msg_type") // 查询得到所有指定消息类型的item项:items return items, nil } // 利用url中的可变参数id来从数据库查看数据并返回 func (ctx *ItemMsgContext) getItem(id string) (interface{}, error) { // 从url中得到id值,再利用id值从数据库中找到指定的item return item, nil }
说明:ctxrouter开源库中提供了多种不同形式的请求,可根据用户需求来选择。
5、后记
通过以上三步,就可以完整搭建一个http服务,而且具有很好的扩展性和维护性。此外,经实际工程项目中验证,此开源库具有较高的稳定性和响应时效,没有任何异常,推荐使用此库来实现http服务。