一种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:, 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) > {
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语言实现的更多相关文章
- 常见的三种Web服务架构
常见的三种Web服务架构 转自http://www.cnblogs.com/bvbook/archive/2008/12/24/1360942.html 相互竞争的服务架构 The Competing ...
- SOAP Web 服务介绍
已经跨入 2015 年,当今最为常见的两种 Web 服务类型分别是: REST 和 SOAP .不过,从趋势来看,越来越多人已经开始使用 REST 风格的 Web 服务.而 SOAP 大多也开始或已经 ...
- Web服务,XFire的一个例子
Web服务优点 互操作性:实现不同系统间的相互调用(语言无关.平台无关) Web服务是什么 Web 服务是一类应用程序,是能够用编程的方法通过Web调用来实现某个功能的应用程序 Web服务的体系结构 ...
- 四 主要的几种 Web 服务器
一 Microsoft IIS 1. 仅支持 Windows 操作系统,用于 .Net 平台网站的部署和运行. 2. IIS 是一种 Web 服务组件,包括括 Web 服务器.FTP 服务器.NNTP ...
- Web服务架构风格之REST
REST(Representational State Transfer)是一种Web服务的架构,其目的是创建具有良好扩展性的分布式系统.它的约束包含: 使用C/S模型.client和server之间 ...
- 如何在阿里云服务器里配置iis 搭建web服务
IIS,互联网信息服务,一种Web服务组件,利用它,我们可以打开asp.php这些搭建网页所用的文件. 工具/原料 域名 服务器 方法/步骤 登录服务器. 点击开始—>服务器 ...
- (四)输入参数与输出类型为复杂类型的web服务
一. 服务端发布服务 1.1 定义复杂类型:UserBean.java package service; public class UserBean { private String userId; ...
- 应用AXIS开始Web服务之旅(soap web services)——使用三种不同的语言访问创建的Web服务,分别是JAVA、VB、VC
一. 介绍 本文并不是想介绍Web服务的原理.系统架构等,我们假设您已经了解了关于Web服务的一些基本的概念.原理等知识.本文主要是针对那些已经了解Web服务概念,但是还没有亲身体会Web服务所带来令 ...
- WSDL(Web服务描述语言)详细解析(全文转载学习用)
WSDL (Web Services Description Language,Web服务描述语言)是一种XML Application,他将Web服务描述定义为一组服务访问点,客户端可以通过这些服务 ...
随机推荐
- C# 常用文件操作
public class IoHelper { /// <summary> /// 判断文件是否存在 /// </summary> /// <param name=&qu ...
- WebSocket --为什么引入WebSocket协议
Browser已经支持http协议,为什么还要开发一种新的WebSocket协议呢?我们知道http协议是一种单向的网络协议,在建立连接后,它只允许Browser/UA(UserAgent)向WebS ...
- POJ2773(容斥原理)
Happy 2006 Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 11458 Accepted: 4001 Descr ...
- Day2-Python基础2---字符串操作
一.字符串操作 特性:不可修改 name = "my \tname is {name} and i am {year} old" #首字母大写.capitalize print(n ...
- 浅析Java中的native关键字
浅析Java中的native关键字 native关键字说明其修饰的方法是一个原生态方法,方法对应的实现不是在当前文件,而是在用其他语言(如C和C++)实现的文件中.Java语言本身不能对操作系统底层进 ...
- hibernate 单元测试
单元测试 测试 dao service action package com.kaishengit.test; import org.hibernate.Session; import com.ka ...
- DAY19-Django之form组件补充
问题1:注册页面输入为空,报错:keyError:找不到password def clean(self): print("---" ,self.cleaned_data) # if ...
- JS中,根据div数值判断弹出窗口
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- [Python Study Notes]行人检测
# -------------------------------------------------------------- # @文件: 行人识别.py # @工程: blog # @时间: 2 ...
- [Python Study Notes]折线图绘制
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ...