热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

golangrestful框架之goswagger

restful是这些年的高频词汇了,各大互联网公司也都纷纷推出了自己的restfulapi,其实restful和thrift,grpc类似,就是一种协议,但是这种协议有点特殊的就是

restful 是这些年的高频词汇了,各大互联网公司也都纷纷推出了自己的 restful api,其实 restful 和 thrift,grpc 类似,就是一种协议,但是这种协议有点特殊的就是使用 http 接口,返回的对象一般是 json 格式,这样有个好处,就是可以供前端的 js 直接调用,使用非常方便,但 http 本身并不是一个高效的协议,后端的内部通信还是使用 grpc 或者 thrift 可以获得更高的性能

其实如果只是要用 http 返回 json 本身并不是一件很难的事情,不用任何框架,golang 本身也能很方便做到,但是当你有很多 api 的时候,这些 api 的维护和管理就会变得很复杂,你自己都无法记住这些 api 应该填什么参数,返回什么,当然你可以花很多时间去维护一份接口文档,这样不仅耗时而且很难保证文档的即时性,准确性以及一致性

swagger 有一整套规范来定义一个接口文件,类似于 thrift 和 proto 文件,定义了服务的请求内容和返回内容,同样也有工具可以生成各种不同语言的框架代码,在 golang 里面我们使用 go-swagger 这个工具,这个工具还提供了额外的功能,可以可视化显示这个接口,方便阅读

下面通过一个例子来简单介绍一下这个框架的使用,还是之前的点赞评论系统:https://github.com/hatlonely/microservices

go-swagger 使用方法

api 定义文件

首先需要写一个 api 定义文件,这里我只展示其中一个接口 countlike,请求中带有某篇文章,返回点赞的次数

paths:
  /countlike:
    get:
      tags:
        - like
      summary: 有多少赞
      description: ''
      operationId: countLike
      consumes:
        - application/json
      produces:
        - application/json
      parameters:
        - name: title
          in: query
          description: 文章标题
          required: true
          type: string
      responses:
        '200':
          description: 成功
          schema:
            $ref: '#/definitions/CountLikeModel'
        '500':
          description: 内部错误
          schema:
            $ref: '#/definitions/ErrorModel'
definitions:
  CountLikeModel:
    type: object
    properties:
      count:
        type: integer
      title:
        type: string
        example: golang json 性能分析
  ErrorModel:
    type: object
    properties:
      message:
        type: string
        example: error message
      code:
        type: integer
        example: 400

这个是 yaml 语法,有点像去掉了括号的 json

这里完整地定义了请求方法、请求参数、正常返回接口、异常返回结果,有了这个文件只需要执行下面命令就能生成框架代码了

swagger generate server -f api/comment_like/comment_like.yaml

还可以下面这个命令可视化查看这个接口文件

swagger serve api/comment_like/comment_like.yaml

这个命令依赖 swagger 工具,可以通过下面命令获取

Mac

brew tap go-swagger/go-swagger
brew install go-swagger

Linux

go get -u github.com/go-swagger/go-swagger/cmd/swagger
export PATH=$GOPATH/bin:$PATH

执行完了之后,你发现多了几个文件夹,其中 cmd 目录里面包含 main 函数,是整个程序的入口,restapi 文件夹下面包含协议相关代码,其中 configure_xxx.go 是需要特别关注的,你需要在这个文件里面实现你具体的业务逻辑

现在你就其实已经可以运行程序了,go run cmd/comment-like-server/main.go,在浏览器里面访问一下你的 api,会返回一个错误信息,告诉你 api 还没有实现,下面就来实现一下吧

业务逻辑实现

api.LikeCountLikeHandler = like.CountLikeHandlerFunc(func(params like.CountLikeParams) middleware.Responder {
    count, err := comment_like.CountLike(params.Title)
    if err != nil {
        return like.NewCountLikeInternalServerError().WithPayload(&models.ErrorModel{
            Code: http.StatusInternalServerError,
            Message: err.Error(),
        })
    }
    return like.NewCountLikeOK().WithPayload(&models.CountLikeModel{
        Count: count,
        Title: params.Title,
    })
})

你只需要在这些 handler 里面实现自己的业务逻辑即可,这里对协议的封装非常好,除了业务逻辑以及打包返回,没有多余的逻辑

再次运行,现在返回已经正常了

统一处理

如果你对请求有一些操作需要统一处理,比如输出统一的日志之类的,可以重写这个函数,也在 configure_xxx.go 这个文件中

func setupGlobalMiddleware(handler http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        w.Header().Set("Access-Control-Allow-Origin", "*")
        handler.ServeHTTP(w, r)
    })
}

这里我统一设置了一下头部,解决跨域访问问题

参考链接

  • go-swagger 官方文档:https://goswagger.io
  • go-swagger github:https://github.com/go-swagger/go-swagger
  • OpenApi 2.0:https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md

转载请注明出处
本文链接:http://hatlonely.github.io/2018/02/08/golang-restful-框架之-go-swagger/


推荐阅读
  • IssuesonGithubaremeantforbugreporting.Pleasepostfeaturerequestsonthe ... [详细]
  • 5分钟学会 gRPC
    5分钟学会gRPC-介绍我猜测大部分长期使用Java的开发者应该较少会接触gRPC,毕竟在Java圈子里大部分使用的还是DubboSpringClound这两类服务框架。我也是 ... [详细]
  • 微服务之总体架构篇
    一、单体架构存在的问题缺点:1、难以维护:当单体应用业务不断迭代后代码量非常臃肿,模整个项目非常复杂,每次更改代码都可能带来新的bug;2、部署项目麻烦:庞大之后项目部署效率 ... [详细]
  • 利用cacti添加mysql监控_cacti监控mysql  mysql复制
    监控mysqlmysql复制5.1.1主机配置1台cactiserver10.10.54.1593台msyqlservermaster:10.10.54.157sla ... [详细]
  • 开发笔记:网络协议系列八传输层TCP之可靠传输
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了网络协议系列八-传输层-TCP之可靠传输相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 4G模组GPS定位功能使用说明
    1概述    高新兴(ME3630-W)和SIMcom4G模块(7600CE)均带有GPS定位功能,下面介绍两个模块GPS定位功能的使用。2GPS功能使用说明    GPS定位模式 ... [详细]
  • adbshell模拟发送安卓广播的入门知识和实例讲解:入门 ... [详细]
  • 1、背景-在项目的实施过程中,由于有dev环境和pro环境,这时会有两个redis集群,但是部分数据从甲方的三方数据库中获取存入生产环境的redis集群中,为了方便测试和数据校验, ... [详细]
  • 闲话少说,直接切入主题,之前也是用一下其他的IDE,但是总是在vi和IDE之间来回切换,比较麻烦,于是乎,找了几个插件亲身体验,功能挺不错;1、安装vi7.0vim的官方网站是:www.vmuni ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 本文介绍了Java后台Jsonp处理方法及其应用场景。首先解释了Jsonp是一个非官方的协议,它允许在服务器端通过Script tags返回至客户端,并通过javascript callback的形式实现跨域访问。然后介绍了JSON系统开发方法,它是一种面向数据结构的分析和设计方法,以活动为中心,将一连串的活动顺序组合成一个完整的工作进程。接着给出了一个客户端示例代码,使用了jQuery的ajax方法请求一个Jsonp数据。 ... [详细]
  • 本文整理了Java中org.gwtbootstrap3.client.ui.Icon.addDomHandler()方法的一些代码示例,展示了Icon.ad ... [详细]
  • 前言本篇为大家总结社区多人合作常见的场景和对应的git操作命令。本篇非新手教程,阅读本篇前需具备Git基础知识。Git入门教程请参考https://www ... [详细]
  • Istio是一个用来连接、管理和保护微服务的开放平台。Istio提供一种简单的方式来为已部署的服务建 ... [详细]
  • golang反射,golang反射性能
    本文目录一览:1、关于反射2、尝试用golan ... [详细]
author-avatar
陪-祥到最-後
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有