# 控制器

# 定义

在 orange 框架中,控制器是这样一个函数 func(ctx *app.Context) error,如下是典型的控制器定义

import (
   "gitee.com/zhucheer/orange/app"
)

func Welcome(c *app.Context) error {

   return c.ToJson(map[string]interface{}{
      "info": "orange is a fast api framework",
   })
}

# 请求

# 获取参数

# GET参数

通过控制的中的 Request 可以获得原始 request;使用 FormValue 即可获得 GET 参数;

c.Request().FormValue("token")

# POST / GET 参数获取统一方案

在 orange 中通过 参数绑定 的方式可以获取 GET/POST 参数,参数绑定方式能获取表单提交类型的参数和json类型的参数,兼容性较好。

具体代码如下:

...
func Welcome(c *app.Context) error {
    req := struct {
       Id int `json:"id"`
    }{}
   err := c.ParseForm(&req)
   if err != nil {
      return c.ResponseWrite([]byte("参数解析错误"))
   }

...
}
...

注意:请求参数中包含&、>、<等特殊符号时需要进行 urlencode 编码,通过参数绑定后会自动进行 urldecode 解码; 例如传递参数是一个 url 时,需要对该参数进行 urlencode 后传入。

# 请求响应

Orange 对原生http响应进行了封装,有如下方法快速处理http响应

  • c.ResponseWrite([]byte) 输出原始响应内容
  • c.ResponseHeader() 配置/获取响应头
  • c.ToJson(interface{}) 以json的方式输出响应
  • c.ToString(string) 以字符串的方式输出响应
  • c.ToFile("./storage/file.txt", "fileName") 以文件流方式输出一个文件,浏览器会提示下载文件
  • c.ToImage("./storage/logo.png") 以文件流方式输出一个图片,浏览器会直接显示该图片

代码参考

...
func Welcome(c *app.Context) error {
    return c.ResponseWrite([]byte("欢迎访问orange框架")) 
...
}

func WelcomeJson(c *app.Context) error {
    return c.ToJson(map[string]interface{}{
       "info": "orange is a fast api framework",
    })
}

func WelcomeText(c *app.Context) error {
    c.ResponseHeader().Set("Content-Type","application/text")
    return c.ToString( "orange is a fast api framework")
}

...

# 控制器异步后置操作

在特定的业务中,我们可能需要在请求正常返回后进行一些用户不可见的处理逻辑; 例如:后台业务中的行为记录,批量插入异步处理等等; Orange 框架提供了后置操作的能力;使用如下:

// 控制器方法
func Welcome(c *app.Context) error {

    // 添加一个后置执行方法,包含一个执行方法和一个延时时间两个参数
   c.AddDelayAfterDo(func(ctx *app.Context) {
      fmt.Println(string(ctx.ResponseBody()), ctx.OrangeInput.IP())
   }, time.Second)
   return c.ToString("hello world!")
}