Write the Code. Change the World.

11月 25

对于一个请求,通常总是会有反馈的。请求是 request,反馈是 response。 这个是基础。

request

官网: https://docs.iris-go.com/iris/requests/url-query

headers

bind: https://docs.iris-go.com/iris/requests/headers

app.Get("/", handler)

func handler(ctx iris.Context) {
    requestID := ctx.GetHeader("X-Request-Id")
    authentication := ctx.GetHeader("Authentication")
}

URL Path Parameters
bind: https://docs.iris-go.com/iris/requests/url-path-params

app.Get("/{name}/{age:int}/{tail:path}", handler)

func handler(ctx iris.Context) {
    params := ctx.Params()

    name   := params.Get("name")
    age    := params.GetIntDefault("age", 18)
    tail   := strings.Split(params.Get("tail"), "/")
}

更多 example:https://github.com/kataras/iris/tree/master/_examples/request-body

不过,如果仅仅只是拿到数据还是不够的。对类型检查,数据要求等也要处理了才更美。这里以 json 为例。

# 我们先定义一个 User 的结构体
type User struct {
    Nickname string `json:"nickname"  validate:"required"`
    Gender   int    `json:"gender" validate:"gte=0,lte=2"`
    Email    string `json:"email" validate:"required,email"`
}

# 读数据进去
func Handler(ctx iris.Context) {
    var user User
    err := ctx.ReadJSON(&user)
    if err != nil {
        // Handle the error, below you will find the right way to do that...

        if errs, ok := err.(validator.ValidationErrors); ok {
            // Wrap the errors with JSON format, the underline library returns the errors as interface.
            validationErrors := wrapValidationErrors(errs)

            // Fire an application/json+problem response and stop the handlers chain.
            ctx.StopWithProblem(iris.StatusBadRequest, iris.NewProblem().
                Title("Validation error").
                Detail("One or more fields failed to be validated").
                Type("/user/validation-errors").
                Key("errors", validationErrors))

            return
        }

        // It's probably an internal JSON error, let's dont give more info here.
        ctx.StopWithStatus(iris.StatusInternalServerError)
        return
    }

    ctx.JSON(iris.Map{"message": "OK"})
}

不仅如此,如果加入 orm 的数据库迁移就更好了。后边再去看吧。

Response

有了输入,那怎么可以少得了输出呢。

请看文档:https://docs.iris-go.com/iris/responses/json

# 试试
type User struct {
    Nickname string `json:"nickname"  validate:"required"`
    Gender   int    `json:"gender" validate:"gte=0,lte=2"`
    Email    string `json:"email" validate:"required,email"`
}

func Get(ctx iris.Context) {
   user := User{"给我一个理由忘记", 1, "admin@go.com"}
   ctx.StatusCode(200)
   ctx.JSON(user)
}

response 的时候, status code 这个很重要。常用的 code 200, 201, 403, 404 这些是需要根据场景来分配的。 response 返回的格式也有很多种。而作为 api,通常返回 json 格式的数据。

设置 http status code 码:

ctx.StatusCode(200)

发表评论

电子邮件地址不会被公开。 必填项已用*标注