一种Web服务的go语言实现

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服务。

猜你喜欢

转载自www.cnblogs.com/share-ideas/p/10719048.html