rest 服务说明

rest 协议主要是将配置文件中的宏暴露为rest 接口,使用了labstack/echo web 框架,同时基于context 模型
进行宏管理对象的共享,同时进行了一些中间件的注册 cors RemoveTrailingSlash gzip Recover

rest 启动

  • 中间件注册
 
  e.Pre(middleware.RemoveTrailingSlash())
  e.Use(middleware.CORS())
  e.Use(middleware.GzipWithConfig(middleware.GzipConfig{Level: 9}))
  e.Use(middleware.Recover())
  • 路由配置
    默认配置,以及指定宏的路由
 
  e.GET("/", routeIndex)
  e.Any("/:macro", routeExecMacro, middlewareAuthorize)
 
 
  • 宏执行路由
    包含了一个授权的中间件,同时在这个中间件中传递共享变量(macro)
 
func middlewareAuthorize(next echo.HandlerFunc) echo.HandlerFunc {
  return func(c echo.Context) error {
    if strings.HasPrefix(c.Param("macro"), "_") {
      return c.JSON(403, map[string]interface{}{
        "success": false,
        "error": "access not allowed",
      })
    }
    macro := macrosManager.Get(c.Param("macro"))
    if macro == nil {
      return c.JSON(404, map[string]interface{}{
        "success": false,
        "error": "resource not found",
      })
    }
    if len(macro.Methods) < 1 {
      macro.Methods = []string{c.Request().Method}
    }
    methodIsAllowed := false
    for _, method := range macro.Methods {
      method = strings.ToUpper(method)
      if c.Request().Method == method {
        methodIsAllowed = true
        break
      }
    }
    if !methodIsAllowed {
      return c.JSON(405, map[string]interface{}{
        "success": false,
        "error": "method not allowed",
      })
    }
    // for _, endpoint := range macro.Authorizers {
    // parts := strings.SplitN(endpoint, " ", 2)
    // if len(parts) < 2 {
    // return c.JSON(500, map[string]interface{}{
    // "success": false,
    // "error": fmt.Sprintf("authorizer: %s is invalid", endpoint),
    // })
    // }
    // resp, err := resty.R().SetHeaders(map[string]string{
    // "Authorization": c.Request().Header.Get("Authorization"),
    // }).Execute(parts[0], parts[1])
    // if err != nil {
    // return c.JSON(500, map[string]interface{}{
    // "success": false,
    // "error": err.Error(),
    // })
    // }
    // if resp.StatusCode() >= 400 {
    // return c.JSON(resp.StatusCode(), map[string]interface{}{
    // "success": false,
    // "error": resp.Status(),
    // })
    // }
    // }
   // 路由共享变量
    c.Set("macro", macro)
    return next(c)
  }
}
 
 
  • routeExecMacro
    routes.go 解析请求参数,解析宏,返回json 格式数据
 
// routeExecMacro - execute the requested macro
func routeExecMacro(c echo.Context) error {
// 获取请求参数,转换为支持宏绑定的map 对象
  macro := c.Get("macro").(*Macro)
  input := make(map[string]interface{})
  body := make(map[string]interface{})
  c.Bind(&body)
  for k := range c.QueryParams() {
    input[k] = c.QueryParam(k)
  }
  for k, v := range body {
    input[k] = v
  }
  headers := c.Request().Header
  for k, v := range headers {
    input["http_"+strings.Replace(strings.ToLower(k), "-", "_", -1)] = v[0]
  }
  out, err := macro.Call(input)
  if err != nil {
    code := errStatusCodeMap[err]
    if code < 1 {
      code = 500
    }
    return c.JSON(code, map[string]interface{}{
      "success": false,
      "error": err.Error(),
      "data": out,
    })
  }
  return c.JSON(200, map[string]interface{}{
    "success": true,
    "data": out,
  })
}
 
 

参考资料

https://github.com/labstack/echo
https://github.com/alash3al/sqler/blob/master/server_rest.go
https://github.com/alash3al/sqler/blob/master/routes.go

sqler sql 转rest api 源码解析(三) rest协议的更多相关文章

  1. sqler sql 转rest api 源码解析(一)应用的启动入口

    sqler sql 转rest api 的源码还是比较简单的,没有比较复杂的设计,大部分都是基于开源 模块实现的. 说明: 当前的版本为2.0,代码使用go mod 进行包管理,如果本地运行注意gol ...

  2. sqler sql 转rest api 源码解析(四)macro 的执行

    macro 说明 macro 是sqler 的核心,当前的处理流程为授权处理,数据校验,依赖执行(include),聚合处理,数据转换 处理,sql 执行以及sql 参数绑定 授权处理 这个是通过go ...

  3. sqler sql 转rest api 源码解析(二) resp 协议

    resp 协议主要是方便使用redis 客户端进行连接,resp 主要是依赖 tidwall/redcon golang redis 协议包 resp 服务说明 server_resp.go 文件,干 ...

  4. Mybatis源码解析(三) —— Mapper代理类的生成

    Mybatis源码解析(三) -- Mapper代理类的生成   在本系列第一篇文章已经讲述过在Mybatis-Spring项目中,是通过 MapperFactoryBean 的 getObject( ...

  5. Celery 源码解析三: Task 对象的实现

    Task 的实现在 Celery 中你会发现有两处,一处位于 celery/app/task.py,这是第一个:第二个位于 celery/task/base.py 中,这是第二个.他们之间是有关系的, ...

  6. ReactiveCocoa源码解析(三) Signal代码的基本实现

    上篇博客我们详细的聊了ReactiveSwift源码中的Bag容器,详情请参见<ReactiveSwift源码解析之Bag容器>.本篇博客我们就来聊一下信号量,也就是Signal的的几种状 ...

  7. ReactiveSwift源码解析(三) Signal代码的基本实现

    上篇博客我们详细的聊了ReactiveSwift源码中的Bag容器,详情请参见<ReactiveSwift源码解析之Bag容器>.本篇博客我们就来聊一下信号量,也就是Signal的的几种状 ...

  8. React的React.createRef()/forwardRef()源码解析(三)

    1.refs三种使用用法 1.字符串 1.1 dom节点上使用 获取真实的dom节点 //使用步骤: 1. <input ref="stringRef" /> 2. t ...

  9. 第三十四节,目标检测之谷歌Object Detection API源码解析

    我们在第三十二节,使用谷歌Object Detection API进行目标检测.训练新的模型(使用VOC 2012数据集)那一节我们介绍了如何使用谷歌Object Detection API进行目标检 ...

随机推荐

  1. uitableviewcell textlabel detailtextLabel 换行的位置及尺寸问题

    我们在使用uitableView的时候,一些简单的cell样式其实是不需要自定义的,但是系统的方法又似乎又无法满足需要,这时候我们就需要在系统上做一些改变来达到我们的需求: 像这种cell,简单分析下 ...

  2. [Linux]Linux下开启snmp支持IPV4和IPV6

    SNMP简介 简单网络管理协议(SNMP),由一组网络管理的标准组成,包含一个应用层协议(application layer protocol).数据库模型(database schema)和一组资源 ...

  3. 总结小bug

    1.下拉刷新问题 //不要用scroll-view 他会阻止刷新 //改用view <template name="movieGridTemplate"> <!- ...

  4. OpenStack之queens版本创建负载均衡器时报错问题!

    采用kolla-ansible部署完毕后,创建负载均衡器时会提示如下的报错 解决办法: 修改网络节点的neutron-lbaas-agent容器 进入lbaas容器里 [root@openstack0 ...

  5. 1.Python爬虫入门一之综述

    要学习Python爬虫,我们要学习的共有以下几点: Python基础知识 Python中urllib和urllib2库的用法 Python正则表达式 Python爬虫框架Scrapy Python爬虫 ...

  6. navicat premium 连接出现的问题

    1.listener does not currently know of service requested in connect descriptor 2.问题截图: 3.问题原因:服务名或者SI ...

  7. L309 单音节词读音规则(一)-辅音字母发音规则

    1 字母和音素不是一一对应的 2单词读音规则知识结构全图 二 15个发音不变化的辅音字母:字母发音和音素一致 b / b /   by d / d /   dog f / f /     fish h ...

  8. 『转』credential Provider 简易改写攻略

    本次小学期的题目是windows下的凭证改编.本人负责的是Win7 下的credentials Provider 的编写以及其他杂七杂八的工作.当然给我印象最深的就是credentials provi ...

  9. dos命令:批处理

    批处理 一.call命令 1.介绍 从批处理程序调用另一个批处理程序. 2.语法 CALL [drive:][path]filename [batch-parameters] batch-parame ...

  10. 使用zabbix-java-gateway可以通过该网关来监听多个JVM

    我们知道监控主机和网络性能指标情况可以使用zabbix很好解决,分析起来也很方便,Zabbix主要功能: - 自动发现服务器与网络设备 - 分布式监视以及WEB集中管理功能 - 可以无agent监视 ...