gin

package
v2.0.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 30, 2026 License: MIT Imports: 7 Imported by: 0

README

Go-Kratos Gin Plugin

fork by https://github.com/go-kratos/gin

Usage

package main

import (
	"context"
	"fmt"
	"log"

	"github.com/gin-gonic/gin"
	kgin "github.com/omalloc/contrib/v2/kratos/gin"
	"github.com/go-kratos/kratos/v3"
	"github.com/go-kratos/kratos/v3/errors"
	"github.com/go-kratos/kratos/v3/middleware"
	"github.com/go-kratos/kratos/v3/middleware/recovery"
	"github.com/go-kratos/kratos/v3/transport"
	"github.com/go-kratos/kratos/v3/transport/http"
)

func customMiddleware(handler middleware.Handler) middleware.Handler {
	return func(ctx context.Context, req interface{}) (reply interface{}, err error) {
		if tr, ok := transport.FromServerContext(ctx); ok {
			fmt.Println("operation:", tr.Operation())
		}
		reply, err = handler(ctx, req)
		return
	}
}

func main() {
	router := gin.Default()
	router.Use(kgin.Middlewares(recovery.Recovery(), customMiddleware))
	router.GET("/helloworld/:name", func(ctx *gin.Context) {
		name := ctx.Param("name")
		if name == "error" {
			kgin.Error(ctx, errors.Unauthorized("auth_error", "no authentication"))
		} else {
			ctx.JSON(200, map[string]string{"welcome": name})
		}
	})

	httpSrv := http.NewServer(http.Address(":8000"))
	httpSrv.HandlePrefix("/", router)

	app := kratos.New(
		kratos.Name("gin"),
		kratos.Server(
			httpSrv,
		),
	)
	if err := app.Run(); err != nil {
		log.Fatal(err)
	}
}

Documentation

Index

Examples

Constants

This section is empty.

Variables

This section is empty.

Functions

func ContentType

func ContentType(subtype string) string

ContentType returns the content-type with base prefix.

func Error

func Error(c *gin.Context, err error)

Error encodes the object to the HTTP response. It is recommended that you return error directly.

func FromGinContext

func FromGinContext(ctx context.Context) (c *gin.Context, ok bool)

FromGinContext returns the gin.Context value stored in ctx, if any.

func Middlewares

func Middlewares(m ...middleware.Middleware) gin.HandlerFunc

Middlewares return middlewares wrapper

Example
package main

import (
	"fmt"
	"log/slog"
	"net"
	"time"

	"github.com/gin-gonic/gin"
	"github.com/go-kratos/kratos/v3"
	"github.com/go-kratos/kratos/v3/errors"
	"github.com/go-kratos/kratos/v3/log"
	"github.com/go-kratos/kratos/v3/middleware/metadata"
	"github.com/go-kratos/kratos/v3/middleware/recovery"
	"github.com/go-kratos/kratos/v3/transport/http"
	"github.com/go-resty/resty/v2"

	kgin "github.com/omalloc/contrib/v2/kratos/gin"
)

func main() {
	gin.SetMode(gin.ReleaseMode)
	r := gin.New()
	r.Use(kgin.Middlewares(
		recovery.Recovery(),
		metadata.Server(),
	))

	generator := func(value string) string {
		return fmt.Sprintf("hello %s", value)
	}

	r.GET("/hellworld", func(ctx *gin.Context) {
		v := ctx.Query("name")
		ctx.JSON(200, gin.H{
			"message": generator(v),
		})
	})

	r.GET("/panic", func(ctx *gin.Context) {
		kgin.Error(ctx, errors.New(500, "want panic", "panic"))
	})

	r.GET("/nilerr", func(ctx *gin.Context) {
		kgin.Error(ctx, nil)
	})
	r.GET("/err", func(ctx *gin.Context) {
		ctx.Request.Header.Set("Accept", "application/xml")
		kgin.Error(ctx, errors.New(500, "want err xml", "json xml"))
	})

	listener, err := net.Listen("tcp", "127.0.0.1:0")
	if err != nil {
		panic(err)
	}
	addr := listener.Addr().String()

	httpSrv := http.NewServer(http.Listener(listener))
	httpSrv.HandlePrefix("/", r)

	app := kratos.New(
		kratos.Logger(log.NewLogger(slog.DiscardHandler)),
		kratos.Name("gin-test"),
		kratos.Server(
			httpSrv,
		),
	)

	go func() {
		ticker := time.NewTicker(200 * time.Millisecond)
		<-ticker.C

		client := resty.New()

		resp, err := client.NewRequest().Get(fmt.Sprintf("http://%s/hellworld?name=gin", addr))
		if err != nil {
			panic(err)
		}

		fmt.Println(resp.String())

		resp, err = client.NewRequest().Get(fmt.Sprintf("http://%s/panic", addr))
		if err != nil {
			panic(err)
		}

		fmt.Println(resp.String())

		resp, err = client.NewRequest().Get(fmt.Sprintf("http://%s/nilerr", addr))
		if err != nil {
			panic(err)
		}

		fmt.Println(resp.String())

		resp, err = client.NewRequest().Get(fmt.Sprintf("http://%s/err", addr))
		if err != nil {
			panic(err)
		}
		fmt.Println(resp.String())

		if err := app.Stop(); err != nil {
			fmt.Println(err)
		}
	}()

	if err := app.Run(); err != nil {
		fmt.Println(err)
	}

}
Output:
{"message":"hello gin"}
{"code":500, "reason":"want panic", "message":"panic", "metadata":{}}

func NewGinContext

func NewGinContext(ctx context.Context, c *gin.Context) context.Context

NewGinContext returns a new Context that carries gin.Context value.

Types

This section is empty.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL