文章目录

  • go-restful
  • 特性
  • 概念
    • Routes
    • WebServices
    • Containers
    • Filters
      • Container Filters
      • WebService Filters
      • Route Filters
      • 自定义Filters
  • 示例

go-restful

go-restful 是一个 Golang 第三方库,是一个轻量的 RESTful API 框架,基于 Golang Build-in 的 http/net 库。适用于构建灵活多变的 Web Application,Kubernetes 的 ApiServer 也使用了 go-restful。

特性

  • 支持使用路径参数进行请求→函数映射的路由
  • 可配置的路由器:默认使用 CurlyRouter 快速路由算法,也支持 RouterJSR311。
  • 提供 Request API 用于从 JSON、XML 读取路径参数、查询参数、头部参数,并转换为 Struct。
  • 提供 Response API 用于将 Struct 写入到 JSON、XML 以及 Header。
  • 支持在服务级、或路由级对请求、响应流进行过滤和拦截。
  • 不同HTTP端点上的WebServices容器
  • 支持使用过滤器自动响应 OPTIONS 请求和 CORS(跨域)请求。
  • 支持使用 RecoverHandler 自定义处理 HTTP 500 错误。
  • 支持使用 ServiceErrorHandler 自定义处理路由错误产生 HTTP 404/405/406/415 等错误。
  • 支持对请求、响应的有效负载进行编码(例如:gzip、deflate)。
  • 支持使用 CompressorProvider 注册自定义的 gzip、deflate 的读入器和输出器。
  • 支持使用 EntityReaderWriter 注册的自定义编码实现。
  • 支持 Swagger UI 编写的 API 文档。
  • 支持可配置的日志跟踪

概念

Routes

Route是由HTTP方法、URL路径和使用的MIME类型(Content-Type)和生成的MIME类型(Accept)定义的。这个包有查找最佳匹配Route的逻辑,如果找到了,就调用它的Function。

WebServices

WebService有一个Route对象集合,这些对象将流入的Http请求分派给一个函数调用。通常,WebService有一个根路径(例如/users),并为它的路由定义了常见的MIME类型。为了处理来自服务器的Http请求,必须将WebServices添加到容器中。

Containers

容器包含WebServices、Filters和用于复用http请求的http.ServeMux的集合。使用restful.add(…)restful.filter(…)将WebServices和Filters注册到默认容器中。go-rest的默认容器使用http.DefaultServeMux。您可以创建自己的Container并为特定容器创建一个新的http.Server。

Filters

过滤器动态地拦截请求和响应,以转换或使用包含在请求或响应中的信息。您可以使用过滤器来执行通用的日志记录、测量、身份验证、重定向、设置响应头等。在restfull包中,有三个hook进入请求、响应流,可以在其中添加过滤器。

Container Filters

在任意已注册的WebService之前处理这些服务。

// 为默认容器安装一个(全局)过滤器(在任意webservice之前处理)
restful.Filter(globalLogging)

WebService Filters

在WebService的任意路由之前处理。

// 安装webservice过滤器(在任意路由之前处理)
ws.Filter(webserviceLogging).Filter(measureTime)

Route Filters

在调用与路由相关的函数之前被处理。

// 安装2个链式路由过滤器(在调用findUser之前处理)
ws.Route(ws.GET("/{user-id}").Filter(routeLogging).Filter(NewCountFilter().routeCounter).To(findUser))

自定义Filters

每个 Filter 必须实现一个 FilterFunction

func(req *restful.Request, resp *restful.Response, chain *restful.FilterChain)

并使用如下语句传递请求、响应对到下一个 Filter 或 RouteFunction:

chain.ProcessFilter(req, resp)

示例

package mainimport ("io""log""net/http""github.com/emicklei/go-restful"swagger "github.com/emicklei/go-restful-swagger12"
)type UserResource struct{}func (u UserResource) result(request *restful.Request, response *restful.Response) {io.WriteString(response.ResponseWriter, "this would be a normal response")
}func (UserResource) SwaggerDoc() map[string]string {return map[string]string{"":         "Address doc","country":  "Country doc","postcode": "PostCode doc",}
}func (u UserResource) RegisterTo(container *restful.Container) {ws := new(restful.WebService)ws.Path("/user").Consumes("*/*").Produces("*/*")ws.Route(ws.GET("/{id}").To(u.result).Doc("方法描述:获取用户").Param(ws.PathParameter("id", "参数描述:用户ID").DataType("string")).Param(ws.QueryParameter("name", "用户名称").DataType("string")).Param(ws.HeaderParameter("token", "访问令牌").DataType("string")).Do(returns200, returns500))ws.Route(ws.POST("").To(u.result))ws.Route(ws.PUT("/{id}").To(u.result))ws.Route(ws.DELETE("/{id}").To(u.result))container.Add(ws)
}func returns200(b *restful.RouteBuilder) {b.Returns(http.StatusOK, "OK", "success")
}func returns500(b *restful.RouteBuilder) {b.Returns(http.StatusInternalServerError, "Bummer, something went wrong", nil)
}func main() {wsContainer := restful.NewContainer()// 跨域过滤器cors := restful.CrossOriginResourceSharing{ExposeHeaders:  []string{"X-My-Header"},AllowedHeaders: []string{"Content-Type", "Accept"},AllowedMethods: []string{"GET", "POST"},CookiesAllowed: false,Container:      wsContainer}wsContainer.Filter(cors.Filter)// Add container filter to respond to OPTIONSwsContainer.Filter(wsContainer.OPTIONSFilter)config := swagger.Config{WebServices:    restful.DefaultContainer.RegisteredWebServices(), // you control what services are visibleWebServicesUrl: "http://localhost:8080",ApiPath:        "/apidocs.json",ApiVersion:     "V1.0",// Optionally, specify where the UI is locatedSwaggerPath:     "/apidocs/",SwaggerFilePath: "D:/gowork/src/doublegao/experiment/restful/dist"}swagger.RegisterSwaggerService(config, wsContainer)swagger.InstallSwaggerService(config)u := UserResource{}u.RegisterTo(wsContainer)log.Print("start listening on localhost:8080")server := &http.Server{Addr: ":8080", Handler: wsContainer}defer server.Close()log.Fatal(server.ListenAndServe())}

Golang — RESTful框架 go-restful相关推荐

  1. python django restful框架_Django RESTful API 实例带你快速上手开发

    1. Django 是什么 Django 是基于 Python 的一个 Web 开发框架,一般和 Flask Tornado 被称为 Python Web 三大框架,Django 是其中最成熟.稳定. ...

  2. golang go-restful RESTful框架 简介

    一个 RESTful API 框架需要什么? 从应用程序开发的角度来看,RESTful API 的本质是一个 Web Application,而 RESTful API 框架就是实现这个 Web Ap ...

  3. Go 语言编程 — go-restful RESTful 框架

    目录 文章目录 目录 一个 RESTful API 框架需要什么? go-restful 核心概念 Route WebService Container 过滤器(Filter) 响应编码(Respon ...

  4. java restful netty_Java RESTful 框架的性能比较

    来源:鸟窝 , colobu.com/2015/11/17/Jax-RS-Performance-Comparison/在微服务流行的今天,我们会从纵向和横向分解代码的逻辑,将一些独立的无状态的代码单 ...

  5. Java RESTful 框架的性能比较

    在微服务流行的今天,我们会从纵向和横向分解代码的逻辑,将一些独立的无状态的代码单元实现为微服务,可以将它们发布到一些分布式计算单元或者Docker中,并在性能需要的时候及时地创建更多的服务单元. 微服 ...

  6. php yii2 api框架,Yii2框架制作RESTful风格的API快速入门教程

    先给大家说下什么是REST restful REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移. 它首次出现在2000年Ro ...

  7. Spring Boot Restful框架搭建和使用【持续更新中】

    2019独角兽企业重金招聘Python工程师标准>>> 1 Spring Boot Restful框架搭建 项目源码地址 2 SpringBoot框架使用技巧记录 2.1 pagea ...

  8. SpringBoot2.x系列教程38--整合JAX-RS之利用Jersey框架实现RESTful

    SpringBoot2.x系列教程38--整合JAX-RS之利用Jersey框架实现RESTful 作者:一一哥 一. JAX-RS与Jersey简介 1. JAX-RS简介 在Java EE 6 中 ...

  9. 使用CodeIgniter框架搭建RESTful API服务

    RESTful不仅仅是一套协议标准更是一种设计思路. 在2011年8月的时候,我写了一篇博客<使用CodeIgniter框架搭建RESTful API服务>,介绍了RESTful的设计概念 ...

最新文章

  1. httpd服务相关实验
  2. 以赛促学,飞桨助力大学生智能车竞赛升级
  3. 从你输入一个网址,到网页显示,其间发生了什么?
  4. 我是如何在两天内做完一个网站的
  5. Android 开发(一)项目概况
  6. [2020.11.27NOIP模拟赛]拼图王【dp】
  7. 印象笔记编辑pdf_笔记软件使用体验(至2020.03)
  8. 在禁用视图状态的情况下仍然使用ViewState对象
  9. 【数字信号调制】基于matlab GUI AM+DSB+SSB+ASK+FSK+PSK调制解调【含Matlab源码 058期】
  10. OFDM学习笔记(四)(信道估计简介)
  11. 使用 freessl.cn 为自己的静态netlify站点添加 https
  12. 玩转【斗鱼直播APP】系列之实现无限轮播
  13. 深度学习头像定位头像分割
  14. 沈其荣院士团队解密根际有益菌VOCs消减土壤青枯菌生物障碍的生存-致病权衡机制...
  15. openGL平行光、点光、聚光
  16. Python遇到过得text和text()
  17. Redis总结:缓存雪崩、缓存击穿、缓存穿透与缓存预热、缓存降级
  18. Java源码 JavaWeb开发框架 代码 SSH SSM OA ERP CRM Java项目[Java通用框架源码及开发视频教程]
  19. TCP/IP数据包 - 传输控制层到链路层
  20. H3 BPM 端到端流程解决方案 (附H3 BPM软件下载地址)

热门文章

  1. 关于ProjectConfig.mk文件相关配置编译名字长度规定
  2. 代码保护(一) 几款加壳工具
  3. C++控制台程序(文字小游戏)
  4. 微信小程序 在tabBar某一项的右上角添加文本(购物车数量)
  5. php 用count 变量,countif函数的使用方法 PHP的可变变量名的使用方法分享
  6. 使用批处理恢复被病毒隐藏的文件和目录
  7. 检查图片是否空白图片
  8. 第8关:判断条件的相容性
  9. 创意发明:带分频整形的单片机频率计(1Hz—20MHz)源程序,仿真与设计论文等全套资料
  10. <A Tale of Evil Twins: Adversarial Inputs versus Poisoned Models>阅读笔记