博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一种Web服务的go语言实现
阅读量:5895 次
发布时间:2019-06-19

本文共 2639 字,大约阅读时间需要 8 分钟。

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

转载于:https://www.cnblogs.com/share-ideas/p/10719048.html

你可能感兴趣的文章
使用ExposedObject对Asp.net MVC中匿名类型的JsonResult做单元测试
查看>>
ajax省市县联动
查看>>
Cox 教学视频5
查看>>
android中的ellipsize设置(省略号的问题)
查看>>
实用帮助中心切换效果以及Css判断
查看>>
[C#学习] BindingNavigator控件
查看>>
算法:翻转单词顺序列
查看>>
Object.assign和序列/反序列
查看>>
Git远程操作详解【转】
查看>>
Git 创建仓库【转】
查看>>
2级DataList嵌套
查看>>
tomcat:javax.servlet.http.HttpServletRequest cannot be resolved
查看>>
在linux通过kubeadm搭建kubernetes群集
查看>>
char varchar
查看>>
读博士的五个阶段
查看>>
[bzoj1787][Ahoi2008]Meet 紧急集合
查看>>
iOS开发——面试篇&面试总结(六)内存问题
查看>>
《Spring1之第六次站立会议》
查看>>
图片照片类的封装(不是相册)
查看>>
javascript 原型详解
查看>>