码迷,mamicode.com
首页 > 编程语言 > 详细

一种Web服务的go语言实现

时间:2019-04-16 18:58:59      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:query   形式   ini   font   errors   lse   http请求   star   扩展性   

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

一种Web服务的go语言实现

标签:query   形式   ini   font   errors   lse   http请求   star   扩展性   

原文地址:https://www.cnblogs.com/share-ideas/p/10719048.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!