진 golang 네트워크 프레임 워크

HTTP golang 네이티브 라이브러리는 이미 쉽게 HTTP 서버를 구현할 수 있지만, 복잡한 웹 서비스, 라우팅 해상도 등을 요청 매개 변수 분석, 객체 반환을 위해, 네이티브 API는 다소 충분히 좋은, 그리고 진은 웹 API의 개발을위한 특히 완벽한 기능, 고성능 웹 네트워크 프레임 워크,

안녕하세요 세계

package main

import "github.com/gin-gonic/gin"

func main() {
    r := gin.New()
    r.GET("/ping", func(c *gin.Context) {
        c.String(200, "hello world")
    })
    r.Run() // listen and serve on 0.0.0.0:8080
}

이것과 hello world절차 모든 비즈니스 로직에 도시 진 func(c *gin.Context)실행 기능, 상기 요청이 gin.Context 투과 반환

요청 매개 변수 구문 분석

진은 요청 매개 변수를 획득 모드의 풍부한 정보를 제공

(c *Context) Query(key string) string               // 获取 GET 参数
(c *Context) QueryArray(key string) []string        // 获取 GET 参数数组
(c *Context) DefaultQuery(key, defaultValue string) // 获取 GET 参数,并提供默认值
(c *Context) Param(key string) string               // 获取 Param 参数,类似于 "/user/:id"
(c *Context) GetRawData() ([]byte, error)           // 获取 body 数据

하지만이 기능의 사용을 권장하지 않습니다, 요청에 대한 구조를 설명하고 인수 요청 매개 변수에 직접 바인딩 API를 사용하는 것이 좋습니다

type HelloWorldReq struct {
    Token    string `json:"token"`
    ID       int    `json:"id" uri:"id"`
    Email    string `json:"email" form:"email"`
    Password string `json:"password" form:"password"`
}

req := &HelloWorldReq{
    Token: c.GetHeader("Authorization"),    // 头部字段无法 bind,可以通过 GetHeader 获取
}

// 用请求中的 Param 参数填充结构体中的 uri 字段
if err := c.BindUri(req); err != nil {
    return nil, nil, http.StatusBadRequest, fmt.Errorf("bind uri failed. err: [%v]", err)
}

// GET 请求中用 Query 参数填充 form 字段
// 非 GET 请求,将 body 中的 json 或者 xml 反序列化后填充 form 字段
if err := c.Bind(req); err != nil {
    return nil, nil, http.StatusBadRequest, fmt.Errorf("bind failed. err: [%v]", err)
}

일반적으로 IP HTTP 클라이언트 요청 헤더 X-Forwarded-ForX-Real-Ip1, 진 제공 (c *Context) ClientIP() stringIP를 얻기 위해

반환 패키지 몸체

(c *Context) String(code int, format string, values ...interface{}) // 返回一个字符串
(c *Context) JSON(code int, obj interface{})                        // 返回一个 json
(c *Context) Status(code int)                                       // 返回一个状态码

파일 업로드 및 반환

요청에서 파일을 가져 오기

fh, err := ctx.FormFile("file")
if err != nil {
    return err
}

src, err := fh.Open()
if err != nil {
    return err
}
defer src.Close()

파일을 반환

(c *Context) File(filepath string)

크로스 도메인을 크로마뇽

헤드 필드가이 서버에서 반환 "액세스 제어 - - 원산지 허용 " 다른 도메인을 요청하는 필드 경우, 브라우저는 사실, 나는이 장소가 클라이언트 액세스 권한이없는해야 이해, 브라우저를 거부됩니다, 여러 사이트를 개발하기 위해 서버가 결과를 반환하지 말아야 브라우저 결과, 그래서 프롬프트 크로스 도메인 오류 사용할 수없는 생각이 헤더 필드는 주소, 또는 서면 *을 쓸 수는, 모든 사이트에 열려 우리가 요청의 "기원"필드가 동적으로 "액세스 제어 - 허용 - 원산지 설정할 수 있습니다 " 필드를 허가은 "원산지"필드의 요구를 충족하기 위해 설정, 진은이 플러그인을 github.com/gin-contrib/cors이 일을 할 수 있도록 설계되었습니다 , 당신은 또한 와일드 카드를 설정할 수 있습니다, 여러 웹 사이트의 AllowOrigins을 설정할 수 있습니다 (설정되는 AllowWildcard에 대한 true)

import "github.com/gin-contrib/cors"

r := gin.New()
r.Use(cors.New(cors.Config{
    AllowOrigins:     []string{"a.example.com", "b.example.com"},
    AllowMethods:     []string{"PUT", "POST", "GET", "OPTIONS"},
    AllowHeaders:     []string{"Origin", "Content-Type", "Content-Length", "Accept-Encoding", "X-CSRF-Token", "Authorization", "Accept", "Cache-Control", "X-Requested-With"},
    AllowCredentials: true,
}))

쿠키

// maxAge 为过期时间
// domain 是网站的地址,如需跨域共享 cookie,可以设置成域名,
//      比如 a.example.com 和 b.example.com,可以将 domain 设置成 example.com
// secure 为 https 设为 true,http 设为 false
// httpOnly 设置为 false,否则 axios 之类的库访问不到 cookie
(c *Context) SetCookie(name, value string, maxAge int, path, domain string, secure, httpOnly bool)

또한, Axios의 필요성은 설정 withCredentials: true정상으로 돌아 쿠키를

링크

소스 알려주십시오
: 기사 링크 https://tech.hatlonely.com/article/55를

추천

출처www.cnblogs.com/hatlonely/p/11945327.html