Golang + Gin にて isAjax() のような機能を実装する

golang のフレームワーク gin-gonic/gin - github を使用していて、
リクエストが XMLHttpRequest (Ajax) なのかどうかを判断したくてドキュメント を見ていたけど、特にそれらしいメソッドがなかったので実装した。

XMLHttpRequest とは

JavaScriptなどのウェブブラウザ搭載のスクリプト言語でサーバとのHTTP通信を行うための、組み込みオブジェクト

だそう。

サンプルコード

c.Request.Header["Origin"] を参照するだけ。
X-Requested-With はクライアント側が設定しないといけないっぽいので設定してなかったら無い。
XMLHttpRequest だとヘッダーに Origin が付与されるっぽい。
ただ、 XMLHttpRequest でなくてもヘッダーに Origin を追加できる(開発環境でのみ確認)ので、挙動としては怪しい。

CORS 対応を簡単に設定できる gin-contrib/cors - github でも Origin を参照していたので、
一旦 Origin を使用して実装した。

main.go

カスタムミドルウェア を参考にした。


import (
    "fmt"
)

func () Ajax() gin.HandlerFunc {
    return func(c *gin.Context) {

        // fmt.Print("\n====== c.GetHeader(Origin) =======\n", c.GetHeader("Origin"), "\n=============\n")
        // fmt.Print("\n====== c.Request.Header.Get(Origin) =======\n", c.Request.Header.Get("Origin"), "\n=============\n")
        // fmt.Print("\n====== c.Request.Header[Origin] =======\n", c.Request.Header["Origin"], "\n=============\n")

        isAjax := false

        // c.GetHeader("Origin")
        // c.Request.Header.Get("Origin")
        if c.GetHeader("Origin") != "" {
            isAjax := true
        }

        // c.Request.Header["Origin"] の場合
        // if c.Request.Header["Origin"] != nil {
        // 	if len(c.Request.Header["Origin"]) > 0 {
        // 		isAjax := true
        // 	}
        // }
        
        c.Set("isAjax", isAjax)
    }
}


func main() {

    r := gin.New()
    r.Use(Ajax())

    r.GET("/test", func(c *gin.Context) {
        if c.MustGet("isAjax").(bool) {
            fmt.Print("XMLHttpRequest です")
        }
    })

    // 0.0.0.0:8080 でサーバーを立てます。
    r.Run(":8080")
}

ビルドが失敗する

$ go build main.go
predeclared any requires go1.18 or later (-lang was set to go1.14; check go.mod)
failed to build, error: exit status 2

go.mod

go.mod のほうのバージョンを 1.18 以上 にしないと func (c *Context) MustGet(key string) any が使えないみたい。

module github.com/psychedelicnekopunch/go-sample

go 1.18

require (
    ~省略~
)
カテゴリー:GinGo