一种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服务描述定义为一组服务访问点,客户端可以通过这些服务 ...
随机推荐
- javascript switch continue break 执行语句
1:switch 关键字段:switch(n).case.break.default switch(n) :n是一个表达式 或者是一变量,用来与其下的各种case进行匹配,比如:此时的day输出的是 ...
- Proxmox qm命令应用实例
1) 把一个物理硬盘增加到VM上qm set 105 --virtio1 /dev/sdb <-- 表示把/dev/sdb物理硬盘以 virtio 接口类型增加至 105 的 ...
- Extjs5.0 学习之路【资源篇】
磨刀不误砍柴工. 先收集资源,然后再开始学习之路. Extjs5.0 文件下载 API-5.0 API离线包 http://cdn.sencha.com/downloads/docs/ext-docs ...
- POJ2831(次小生成树问题)
Can We Build This One? Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 1475 Accepted: ...
- PCIe相关的操作命令
1.lspci --显示列举系统目前的pcie设备 43:00.0 Class 0004: Device 104c:b800 (rev 01) //netra设备 设备编号 ...
- Mysql教程:[1]下载安装配置详细教程
如果不小心你下载了免安装的mysql,那么你比较倒霉,你找不到setup文件,还得自己去配置很多东西,然后再使用命令安装.所以我今天呢写一篇教程,写的尽量详细,即便是菜鸟也能安装,我自己安装过很多遍了 ...
- CreateRemoteThread 远程dll注入
1.dll中的内容 // dllmain.cpp : 定义 DLL 应用程序的入口点.#include "stdafx.h" BOOL APIENTRY DllMain( HMOD ...
- 网页弹出框ClientScript,ScriptManager
网页调用客户端弹出框 this.ClientScript.RegisterStartupScript(this.GetType(), "message", "<sc ...
- 部署和调优 1.6 vsftp部署和优化-2
映射个虚拟用户 创建个用户,不让他登录 useradd virftp -s /sbin/nologin 创建存放虚拟用户用户和密码的文件 vim /etc/vsftpd/vsftpd_login 写入 ...
- 什么是Scatter/Gather?
scatter/gather指的在多个缓冲区上实现一个简单的I/O操作,比如从通道中读取数据到多个缓冲区,或从多个缓冲区中写入数据到通道: scatter(分散):指的是从通道中读取数据分散到多个缓冲 ...