一种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服务描述定义为一组服务访问点,客户端可以通过这些服务 ...
随机推荐
- FPGA中竞争冒险问题的研究
什么是竞争冒险? 1 引言 现场可编程门阵列(FPGA)在结构上由逻辑功能块排列为阵列,并由可编程的内部连线连接这些功能块,来实现一定的逻辑功能. FPGA可以替代其他PLD或者各种中小规模数 ...
- MQTT事件回调流程
TLS 如下强调: 1.每个IOT设备应该有一对独有的公钥/私钥 2.SERVER的认证通过SERVER的"root certificate" SSL产生过程: $ openssl ...
- [转] CentOS系统目录学习
最近初学Linux 对linux的目录产生了很多疑问,看到这篇文章,让我顿时对目录有了一个清晰的认识!推荐给大家! ------------------------------------------ ...
- 山区建小学(区间DP)
山区建小学 时间限制: 1 Sec 内存限制: 128 MB提交: 17 解决: 5[提交][状态][讨论版][命题人:quanxing] 题目描述 政府在某山区修建了一条道路,恰好穿越总共m个村 ...
- 有关Backgroundworker
(一)Backgroundworker取消时应该用的有关代码: CancelAsync方法是在前台主线程用的,CancellationPending属性是在后台子线程用的.实际的使用方式应该是这样的: ...
- Android 4学习(6):概述 - 深入了解Android Activity
参考:<Professional Android 4 Application Development> 深入了解Android Activity 每一个Android Activity都对 ...
- #调整随机森林的参数(调整n_estimators随机森林中树的数量默认10个树,精度递增显著,但并不是越多越好),加上verbose=True,显示进程使用信息
#调整随机森林的参数(调整n_estimators随机森林中树的数量默认10个树,精度递增显著) from sklearn import datasets X, y = datasets.make_c ...
- C#调用带返回值的存储过程
()在SQL Server中建立如下的存储过程: set ANSI_NULLS ON set QUOTED_IDENTIFIER ON GO CREATE PROCEDURE [dbo].[GetNa ...
- Eclipse中如何开启断言(Assert),方法有二
Eclipse中如何开启断言(Assert),方法有二:1.Run -> Run Configurations -> Arguments页签 -> VM arguments文本框中加 ...
- pthon之函数式编程
函数式编程是一种抽象计算的编程范式. 不同语言的抽象层次不同:计算机硬件->汇编语言->C语言->Python语言 指令 -> ->函数 ...