ジンgolangネットワークフレームワーク

HTTP golangネイティブライブラリは、すでに簡単にhttpサーバを実装することができますが、複雑なWebサービスなどのルーティング解像度、リクエストパラメータ解析、オブジェクト戻り、ネイティブAPIのそれはやや良い十分です、とジンがありますウェブAPIの開発のため、特に完全に機能する、高パフォーマンスのWebネットワークのフレームワーク、

こんにちは世界

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-ForおよびX-Real-Ip提供、ジン(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)

CROのクロスドメイン

ヘッドフィールドがあり、サーバから返された「アクセス制御-起源を許可する 」、 別のドメインを要求フィールド場合と、ブラウザは、実際に、私はこの場所は、クライアントがアクセス権を持っていないでなければならないことを理解し、ブラウザを拒否されます、サーバが結果を返すべきではない、複数のサイトを開発するために、ブラウザは、結果が利用できないと考えて、そのプロンプトクロスドメイン・エラー、およびこのヘッダフィールドは、アドレスのみ、または書面*を書くことができ、すべてのサイトに開かれています我々は、要求の「起源」フィールドは、動的に「アクセス制御-許可-起源を設定することができます 」 フィールドに、許可は「起源」フィールドの要求を満たすように設定された、ジンは持っているプラグインをgithub.com/gin-contrib/corsこの事をするように設計されて、あなたはまた、ワイルドカードを設定することができ、複数のWebサイトの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