// JSON serializes the given struct as JSON into the response body. // // It also sets the Content-Type as "application/json". func(ctx *RequestContext)JSON(code int, obj interface{}) { ctx.Render(code, render.JSONRender{Data: obj}) }
// Query string parameters are parsed using the existing underlying request object. // The request responds to url matching: /welcome?firstname=Jane&lastname=Doe&food=apple&food=fish h.GET("/welcome", func(ctx context.Context, c *app.RequestContext) { // 获取单个Query参数,提供默认值 firstname := c.DefaultQuery("firstname", "Guest") // shortcut for c.Request.URL.Query().Get("lastname") // 默认空值 lastname := c.Query("lastname") // 迭代Query参数 // Iterate all queries and store the one with meeting the conditions in favoriteFood var favoriteFood []string c.QueryArgs().VisitAll(func(key, value []byte) { ifstring(key) == "food" { favoriteFood = append(favoriteFood, string(value)) } })
h.GET("/cookie", func(ctx context.Context, c *app.RequestContext) { mc := "myCookie" // get specific key // 获取cookie值 val := c.Cookie(mc) // 新建cookie if val == nil { // set a cookie fmt.Printf("There is no cookie named: %s, and make one...\n", mc) cookie := protocol.AcquireCookie() // 只能设置一个key、一个value cookie.SetKey("myCookie") cookie.SetValue("a nice cookie!") // 有效时间 cookie.SetExpire(time.Now().Add(3600 * time.Second)) cookie.SetPath("/") cookie.SetHTTPOnly(true) cookie.SetSecure(false) // 写入响应头 c.Response.Header.SetCookie(cookie) // 将cookie对象放回cookie池中 protocol.ReleaseCookie(cookie) c.WriteString("A cookie is ready.") return }
fmt.Printf("Got a cookie: %s\nAnd eat it!", val) // instruct upload_file to delete a cookie // DelClientCookie instructs the upload_file to remove the given cookie. // This doesn't work for a cookie with specific domain or path, // you should delete it manually like: // // c := AcquireCookie() // c.SetKey(mc) // c.SetDomain("example.com") // c.SetPath("/path") // c.SetExpire(CookieExpireDelete) // h.SetCookie(c) // ReleaseCookie(c) // // 删除 Response 中的 cookie c.Response.Header.DelClientCookie(mc)
// 构造新的 cookie // construct the full struct of a cookie in response's header respCookie := protocol.AcquireCookie() respCookie.SetKey(mc) c.Response.Header.Cookie(respCookie) fmt.Printf("(The expire time of cookie is set to: %s)\n", respCookie.Expire()) protocol.ReleaseCookie(respCookie) c.WriteString("The cookie has been eaten.") })
参数绑定
参数绑定包含以下 API:
API
说明
ctx.BindAndValidate
利用下述的 go-tag 进行参数绑定,并在绑定成功后做一次参数校验 (如果有校验 tag 的话)
ctx.Bind
同 BindAndValidate 但是不做参数校验
ctx.BindQuery
绑定所有 Query 参数,相当于给每一个 field 声明一个 query tag,适用于没写 tag 的场景
ctx.BindHeader
绑定所有 Header 参数,相当于给每一个 field 声明一个 header tag,适用于没写 tag 的场景
ctx.BindPath
绑定所有 Path 参数,相当于给每一个 field 声明一个 path tag,适用于没写 tag 的场景
ctx.BindForm
绑定所有 Form 参数,相当于给每一个 field 声明一个 form tag,需要 Content-Type 为:application/x-www-form-urlencoded/multipart/form-data, 适用于没写 tag 的场景
ctx.BindJSON
绑定 JSON Body,调用 json.Unmarshal() 进行反序列化,需要 Body 为 application/json 格式
ctx.BindProtobuf
绑定 Protobuf Body,调用 proto.Unmarshal() 进行反序列化,需要 Body 为 application/x-protobuf 格式
ctx.BindByContentType
根据 Content-Type 来自动选择绑定的方法,其中 GET 请求会调用 BindQuery, 带有 Body 的请求会根据 Content-Type 自动选择