0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Ginで動的にAPIを定義する

Last updated at Posted at 2024-11-26

はじめに

GoのGinフレームワークを書いている際に入力によって個数が変わるAPIを定義したので備忘録を残しておきます
私が間違っている情報等を書き込んでいるかもしれないので、ご指摘頂けると幸いです。

コード

標準入力の内容によってpathを定義するようなコードになります
動的にAPIを定義する部分はforを回してその中でハンドラを定義するだけですね

package main

import (
	"fmt"
	"strings"

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

func main() {
	var in string
	r := gin.Default()

 	// paths:hoge,huga
	// のような入力を期待
	fmt.Print("paths:")
	fmt.Scan(&in)

	paths := strings.Split(in, ",")


    // forで回すことによって動的にAPIを定義
	for _, path := range paths {

		r.GET(path, func(ctx *gin.Context) {
			ctx.JSON(200, gin.H{
				"path": path,
			})
		})
	}

	r.Run()

}

考察

なぜfor文で回すことができるのか考察しました
考察なのであまりこれが当たっているという保証はありません

gin.Engine

Ginのgithubを見るとgin.Default()で生成されているgin.Engineは以下のURLに示されてるような構造体になっている

RouterGroupという名前のフィールドがあるので見てみる

RouterGroup

Ginのgithubを見るとRouterGroupは以下のような構造体になっている
handlers,basePathなどのフィールドがあるのでここでAPIのエンドポイント情報を記録してそう

routergroup.go
type RouterGroup struct {
	Handlers HandlersChain
	basePath string
	engine   *Engine
	root     bool
}

同ファイルにおいてあったGETメソッドを見るとhandleというメソッドを使っている

routergroup.go
func (group *RouterGroup) GET(relativePath string, handlers ...HandlerFunc) IRoutes {
	return group.handle(http.MethodGet, relativePath, handlers)
}

以下handleメソッド

routergroup.go
func (group *RouterGroup) handle(httpMethod, relativePath string, handlers HandlersChain) IRoutes {
	absolutePath := group.calculateAbsolutePath(relativePath)
	handlers = group.combineHandlers(handlers)
	group.engine.addRoute(httpMethod, absolutePath, handlers)
	return group.returnObj()
}

group.engine.addRoute(httpMethod, absolutePath, handlers)
で最終的にgin.Engineの値としてルート情報を入れている考えられます
GET等のメソッドはhandleに依存しているkため、for文でGET等のメソッドを回してもハンドラーを作ることができる

参考文献

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?