golang gin 框架啓用 CORS 支持

當客戶端(尤其是基於 Web 的客戶端)想要訪問 API 時,服務器會決定允許哪些客戶端發送請求。這是通過使用稱爲 CORS 來完成的,它代表跨源資源共享。

跨域資源共享 (CORS) 是一種機制,允許從提供第一個資源的域之外的另一個域請求網頁上的受限資源。

在gin框架中設置跨域請求非常簡單,代碼如下:

func CustomHeaderAPI(c *gin.Context) {
    // Add CORS headers
    c.Header("Access-Control-Allow-Origin", "http://example.com")
    c.Header("Access-Control-Allow-Methods", "PUT, POST, GET, DELETE, OPTIONS")

    // Prepare response
    c.JSON(http.StatusOK, gin.H{
        "message": "this response has custom headers"
    })
}

但是,將以下代碼行添加到每個 API 中將是一種痛苦。爲了使事情變得更容易,Gin 支持中間件功能。

什麼是中間件功能?這是我在網上找到的一個很好的定義:

中間件函數是可以訪問請求對象 ( req)、響應對象 ( res ) 以及應用程序請求-響應週期中的下一個函數的函數。

您可以自己創建中間件以啓用 CORS 支持;但是,我們不想重新發明輪子!社區中的一羣好人開發了一個庫,以便在 Gin 中啓用 CORS 支持。它被稱爲CORS-gin的中間件。

安裝

go get github.com/gin-contrib/cors
package main

import (
 "time"

 "github.com/gin-contrib/cors"
 "github.com/gin-gonic/gin"
)

func main() {
 router := gin.Default()
 // CORS for https://foo.com and https://github.com origins, allowing:
 // - PUT and PATCH methods
 // - Origin header
 // - Credentials share
 // - Preflight requests cached for 12 hours
 router.Use(cors.New(cors.Config{
  AllowOrigins:     []string{"https://foo.com"},
  AllowMethods:     []string{"PUT", "PATCH"},
  AllowHeaders:     []string{"Origin"},
  ExposeHeaders:    []string{"Content-Length"},
  AllowCredentials: true,
  AllowOriginFunc: func(origin string) bool {
   return origin == "https://github.com"
  },
  MaxAge: 12 * time.Hour,
 }))
 router.Run()
}

面的配置是庫爲您提供的功能的最完整示例。但是,您可能不想全部使用它們。事實上,大多數項目的 CORS 配置都是相同的。爲了使它更簡單,包還有一個名爲的東西,它返回映射到本地主機的通用默認配置。在我看來,使用此庫的最佳方法是將自定義配置添加到 的結果中。例如,這是我自己的項目配置:corsDefaultConfigDefaultConfig

router := gin.Default()
corsConfig := cors.DefaultConfig()

corsConfig.AllowOrigins = []string{"https://example.com"}
// To be able to send tokens to the server.
corsConfig.AllowCredentials = true

// OPTIONS method for ReactJS
corsConfig.AddAllowMethods("OPTIONS")

// Register the middleware
router.Use(cors.New(corsConfig))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章