欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用swagger生成golang服务器

程序员文章站 2024-03-03 19:21:40
...

使用swagger生成golang服务器

样例介绍

本次试验是借助swagger实现一个golang http服务器,前端使用vue的富文本框架。

服务器内容为一个简单的博客网站,具体实现功能页面有:

  • 查询所有用户 /users
  • 查询指定用户的所有文章 /articles/{userName}
  • 根据文章标签筛选指定用户的文章 /articles/{userName}/{tag}
  • 根据文章标题查询文章 /article/{title}

使用swagger生成golang服务器

yaml文件

举一个例子来说:

paths:
  /users:
    get:
      tags:
      - "user"
      summary: "Get all the users"
      operationId: "getAllUsers"
      produces:
      - "application/json"
      parameters: []
      responses:
        "200":
          description: "successful operation"
          schema:
            type: "array"
            items:
              $ref: "#/definitions/User"
        "400":
          description: "Invalid status value"

获得的数据将会以json的格式发送到客户端并被展示出来。这里只是简单地将json格式数据输出到界面上。
该文件也指定了数据的存储方式。

definitions:
  Article:
    type: "object"
    properties:
      author:
        type: "string"
      title:
        type: "string"
      urlPath:
        type: "string"
      tags: 
        type: "array"
        items: 
          type: "string"
    xml:
      name: "Article"

上述的文章类型数据保存了文章的 作者,标题,资源路径以及标签
这些数据将会持久化到数据库中去。
为了不让数据库存储的信息过于庞大以导致查询时间变长,这里只保存文章的 url路径 。因此前端的设计思路为:

  • 在查询一个类型的多篇文章时,只显示文章的标题(当然这里还可以额外存储文章的概要),并将每个标题作为一个链接指向一个url。这样当点击某个标题时,前端将会发送一个数据请求,后端通过该url从特定位置获取文章的二进制流并发送给前端。前端将其渲染在一个单独的页面。
  • 通过标题查询某篇文章时,服务器将直接获取文章主题内容并发送给前端。

该程序由于未设计注册登录功能,因此用户类型只存在 名称和文章标题数组 两个数据类型。

生成golang server

通过swagger editor自动生成的golang服务器已经根据yaml中的内容写好了路由器于启动器。

var routes = Routes{
	Route{
		"Index",
		"GET",
		"/",
		Index,
	},

	Route{
		"FindByAuthorTag",
		strings.ToUpper("Get"),
		"/articles/{userName}/{tag}",
		FindByAuthorTag,
	},

	Route{
		"FindByTitle",
		strings.ToUpper("Get"),
		"/article/{title}",
		FindByTitle,
	},

	Route{
		"FindByUserName",
		strings.ToUpper("Get"),
		"/articles/{userName}",
		FindByUserName,
	},

	Route{
		"GetAllUsers",
		strings.ToUpper("Get"),
		"/users",
		GetAllUsers,
	},
}

数据的json模型也在model_xxx.go中创建好,这样的话只需要在api_xxx.go文件中写入逻辑部分即可。

w.Header().Set("Content-Type", "application/json; charset=UTF-8")
w.WriteHeader(http.StatusOK)
Bytes, err := ioutil.ReadFile("./resources/user.json")
if err != nil {
	log.Fatalln(err)
}

前端界面

前端使用vue的axios插件来进行ajax通信,从而将接受数据渲染在对应位置。

getUser: function () {
    axios({
        method: 'get',
        url: 'users'
	}).then(function(res) {
    	this.users = res.data;
	})
}