Go 语言入门很简单:利用 go-restful 快速构建 RESTful 服务器

1,745 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第 8 天,点击查看活动详情

介绍

go-restful 是一个用于在 go 中构建 RESTful web 服务的包。开源地址点此处

REST 要求开发人员遵循一组设计协议。使用 go-restful,我们可以分离 API 处理程序的逻辑并附加 REST 谓词。这样做的好处是,它通过查看代码清楚地告诉我们正在创建什么样的 API。在进入示例之前,我们需要使用 go-restful 为RESTAPI 安装一个名为 SQLite3 的数据库。安装步骤如下:

apt-get install sqlite3 libsqlite3-dev

或者在 Mac 上使用 brew 命令:

brew install sqlite3

然后通过 go get 命令安装 go-restful 包:

go get github.com/emicklei/go-restful

安装成功截屏如下:

image.png

go-restful 特性

go-restful具有以下特性:

  • 支持可配置的请求路由,默认使用 CurlyRouter 快速路由算法,也支持 RouterJSR311
  • 支持在 URL path 上定义正则表达式,例如:/static/{subpath:*}
  • 提供 Request API 用于从JSONXML 读取路径参数、查询参数、头部参数,并转换为 Struct
  • 提供 Response API用于将 Struct 写入到 JSONXML 以及 Header
  • 支持对请求、响应流进行过滤和拦截。
  • 支持使用过滤器自动响应 OPTIONS请求和CORS(跨域)请求。
  • 支持使用 RecoverHandler 自定义处理 HTTP 500 错误。
  • 支持使用 ServiceErrorHandler 自定义处理路由错误产生 HTTP 404/405/406/415 等错误。
  • 支持对请求、响应的有效负载进行编码(例如:gzipdeflate)。
  • 支持使用 CompressorProvider注册自定义的 gzipdeflate 的读入器和输出器。
  • 支持使用 EntityReaderWriter 注册的自定义编码实现。
  • 支持 Swagger UI编写的 API 文档。
  • 支持可配置的日志跟踪。

简单的服务器

然后可以通过简单的代码写一个服务器:

package main

import (
	"fmt"
	"io"
	"net/http"
	"time"

	"github.com/emicklei/go-restful"
)

func main() {
	// Create a web service
	webservice := new(restful.WebService)
        
	// Create a route and attach it to handler in the service
	webservice.Route(webservice.GET("/ping").To(pingTime))
        
	// Add the service to application
	restful.Add(webservice)
        
	http.ListenAndServe(":8000", nil)
}

func pingTime(req *restful.Request, resp *restful.Response) {

	// Write to the response
	io.WriteString(resp, fmt.Sprintf("%s", time.Now()))
}

然后可以通过运行代码:

go run main.go

服务器将在 localhost 的端口 8000 上运行。因此,我们可以发出 curl 请求或使用浏览器查看 GET 请求输出:

curl -X GET "http://localhost:8000/ping"

另外打开一个终端执行上面的 curl 命令,得到如下的输出:

image.png

可以看到成功打印出当前的时间信息,你如果按照我的方法,可以结果会不一样(因为是你当前运行这个程序的时间)。

更多有趣的 go-resutful 功能等待你的探索,我们今后可以再写其他文章进行研究,如果你也感兴趣,可以自己参考官方的示例。

参考链接: