一种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服务描述定义为一组服务访问点,客户端可以通过这些服务 ...
随机推荐
- hdu 1028 && hdu 1398 && hdu 1085 && hdu 1171 ——生成函数
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1028 就是可以用任意个1.2.3....,所以式子写出来就是这样:(1+x+x^2+...)(1+x^2+ ...
- VirtualBox为虚拟OS硬盘扩容
1.关闭虚拟OS. 2.进入到在VirtualBox的安装路径,执行命令例子如: VBoxManage.exe modifyhd F:\VM\Debian7.2.vdi --resize 40000 ...
- C# 常用文件操作
public class IoHelper { /// <summary> /// 判断文件是否存在 /// </summary> /// <param name=&qu ...
- CentOS7安装wget 及配置
yum -y install wget yum -y install setup yum -y install perl
- RazorHelper.cs
完整版 RazorHelper.cs using System; using System.Collections; using System.Collections.Generic; using S ...
- Java-API:java.text.SimpleDateFormat
ylbtech-Java-API:java.text.SimpleDateFormat 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 0. https://do ...
- iOS开发之---KVC全解
————————————————————————————————————————————————————————————— 一 KVC的基本概念 KVC是Key Value Coding的缩写,意思是 ...
- 【转】Rails中Bootstrap的安装和使用
转自:http://blog.csdn.net/lissdy/article/details/9195651 眼看着前端攻城师们都开始使用Bootstrap创作网页,于是也想学着在最近正在学习的 ...
- S2-045漏洞利用工具&解决方案
简单的重复造一个轮子,漏洞危害蛮大的 影响版本:Struts 2.3.5 - Struts 2.3.31,Struts 2.5 - Struts 2.5.10 仅供学习测试使用,严禁非法操作! 下载链 ...
- vue日常练习一
<html lang="en"> <head> <meta charset="UTF-8"> <title>Ti ...