gors

package module
v1.4.7 Latest Latest
Warning

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

Go to latest
Published: Aug 2, 2023 License: MIT Imports: 27 Imported by: 0

README

gors

gors(Golang Restful service)可以生成Go语言的Restful服务。 在Interface或者grpc上,标注特殊的注解,可以生成已Gin路由。

快速开始

1. 安装

如果通过Interface生成Restful服务,需要安装gors:

go install github.com/go-leo/gors/cmd/gors@latest

如果通过grpc生成Restful服务,需要安装protoc-gen-go-gors:

go install github.com/go-leo/gors/cmd/protoc-gen-go-gors@latest

2. 定义Restful服务

通过Interface定义接口:

//go:generate gors -service Service

// Service
// @GORS @Path("/api)  @Path("/v1)
type Service interface {
	// Method
    // @GORS @GET @Path("/method/:id) @UriBinding @JSONRender
    Method(context.Context, *MethodReq) (*MethodResp, error)
}
type MethodReq struct {
	ID int `uri:"id"`
}
type MethodResp struct {
	V int `json:"v,omitempty"`
}

或者通过grpc定义接口:

syntax = "proto3";
package protoservice;
option go_package = "github.com/go-leo/gors/example/api/protoservice;protoservice";

// @GORS @Path(/v1)
service ProtoService {
  // @GORS @POST @Path(/Method) @ProtoJSONBinding @ProtoJSONRender
  rpc Method (HelloRequest) returns (HelloReply) {}
}

message HelloRequest {
  string name = 1;
  int32 age = 2;
  double salary = 3;
  string Token = 4;
}

message HelloReply {
  string message = 1;
}

3. 生成gin路由代码

通过Interface定义接口,运行go generate ./...命令,生产文件service_gors.go

// Code generated by "gors -service Service"; DO NOT EDIT.

package demo

import (
	gin "github.com/gin-gonic/gin"
	gors "github.com/go-leo/gors"
	http "net/http"
)

func ServiceRoutes(srv Service, opts ...gors.Option) []gors.Route {
	options := gors.New(opts...)
	_ = options
	return []gors.Route{
		gors.NewRoute(
			http.MethodGet,
			"/api/v1/method/:id",
			func(c *gin.Context) {
				var rpcMethodName = "/demo.Service/Method"
				var ctx = gors.NewContext(c, rpcMethodName)
				var req *MethodReq
				var resp *MethodResp
				var err error
				req = new(MethodReq)
				if err = gors.RequestBind(
					ctx, req, options.Tag,
					gors.UriBinding,
				); err != nil {
					gors.ErrorRender(ctx, err, options.ErrorHandler, options.ResponseWrapper)
					return
				}
				resp, err = srv.Method(ctx, req)
				if err != nil {
					gors.ErrorRender(ctx, err, options.ErrorHandler, options.ResponseWrapper)
					return
				}
				gors.ResponseRender(ctx, gors.StatusCode(ctx), resp, "", gors.JSONRender, options.ResponseWrapper)
			},
		),
	}
}

通过protocolbuf生成,运行一下命令,生产文件service_gors.go

protoc \
		--proto_path=. \
		--go_out=. \
		--go_opt=module=github.com/go-leo/gors \
		--go-grpc_out=. \
		--go-grpc_opt=module=github.com/go-leo/gors \
		--go-gors_out=. \
		--go-gors_opt=module=github.com/go-leo/gors \
		example/api/*/*.proto
// Code generated by protoc-gen-go-gors. DO NOT EDIT.

package protoservice

import (
	gin "github.com/gin-gonic/gin"
	gors "github.com/go-leo/gors"
	grpc "google.golang.org/grpc"
	metadata "google.golang.org/grpc/metadata"
	http "net/http"
)

func ProtoServiceClientRoutes(cli ProtoServiceClient, opts ...gors.Option) []gors.Route {
	options := gors.New(opts...)
	_ = options
	if len(options.Tag) == 0 {
		options.Tag = "json"
	}
	return []gors.Route{
		gors.NewRoute(
			http.MethodPost,
			"/v1/Method",
			func(c *gin.Context) {
				var rpcMethodName = "/protoservice.ProtoService/Method"
				var ctx = gors.NewContext(c, rpcMethodName)
				var req *HelloRequest
				var resp *HelloReply
				var err error
				req = new(HelloRequest)
				if err = gors.RequestBind(
					ctx, req, options.Tag,
					gors.ProtoJSONBinding,
				); err != nil {
					gors.ErrorRender(ctx, err, options.ErrorHandler, options.ResponseWrapper)
					return
				}
				if ctx, err = gors.NewGRPCContext(ctx, options.IncomingHeaderMatcher, options.MetadataAnnotators); err != nil {
					gors.ErrorRender(ctx, err, options.ErrorHandler, options.ResponseWrapper)
					return
				}
				var headerMD, trailerMD metadata.MD
				resp, err = cli.Method(ctx, req, grpc.Header(&headerMD), grpc.Trailer(&trailerMD))
				gors.AddGRPCMetadata(ctx, headerMD, trailerMD, options.OutgoingHeaderMatcher)
				if err != nil {
					gors.ErrorRender(ctx, err, options.ErrorHandler, options.ResponseWrapper)
					return
				}
				gors.ResponseRender(ctx, gors.StatusCode(ctx), resp, "", gors.ProtoJSONRender, options.ResponseWrapper)
			},
		),
	}
}

func ProtoServiceServerRoutes(srv ProtoServiceServer, opts ...gors.Option) []gors.Route {
	options := gors.New(opts...)
	_ = options
	if len(options.Tag) == 0 {
		options.Tag = "json"
	}
	return []gors.Route{
		gors.NewRoute(
			http.MethodPost,
			"/v1/Method",
			func(c *gin.Context) {
				var rpcMethodName = "/protoservice.ProtoService/Method"
				var ctx = gors.NewContext(c, rpcMethodName)
				var req *HelloRequest
				var resp *HelloReply
				var err error
				req = new(HelloRequest)
				if err = gors.RequestBind(
					ctx, req, options.Tag,
					gors.ProtoJSONBinding,
				); err != nil {
					gors.ErrorRender(ctx, err, options.ErrorHandler, options.ResponseWrapper)
					return
				}
				if ctx, err = gors.NewGRPCContext(ctx, options.IncomingHeaderMatcher, options.MetadataAnnotators); err != nil {
					gors.ErrorRender(ctx, err, options.ErrorHandler, options.ResponseWrapper)
					return
				}
				stream := gors.NewServerTransportStream(rpcMethodName)
				ctx = grpc.NewContextWithServerTransportStream(ctx, stream)
				resp, err = srv.Method(ctx, req)
				gors.AddGRPCMetadata(ctx, stream.Header(), stream.Trailer(), options.OutgoingHeaderMatcher)
				if err != nil {
					gors.ErrorRender(ctx, err, options.ErrorHandler, options.ResponseWrapper)
					return
				}
				gors.ResponseRender(ctx, gors.StatusCode(ctx), resp, "", gors.ProtoJSONRender, options.ResponseWrapper)
			},
		),
	}
}

4. 实现服务

通过Interface定义接口:

var _ demo.Service = new(Service)

type Service struct {}

func (svc *Service) Method(ctx context.Context, req *demo.MethodReq) (*demo.MethodResp, error) {
	fmt.Println(req.ID)
	return &demo.MethodResp{V: 10}, nil
}

通过grpc定义接口:

package svc

import (
	"context"
	"github.com/go-leo/gors/example/api/protoservice"
)

var _ protoservice.ProtoServiceServer = new(ProtoService)

type ProtoService struct {
	protoservice.UnimplementedProtoServiceServer
}

func (p ProtoService) Method(ctx context.Context, request *protoservice.HelloRequest) (*protoservice.HelloReply, error) {
	return &protoservice.HelloReply{Message: "hi " + request.GetName()}, nil
}


5. 启动服务

通过Interface定义接口:

package main

import (
	"net"
	"net/http"

	"github.com/gin-gonic/gin"

	"github.com/go-leo/gors"
	"github.com/go-leo/gors/example/api/demo"
	"github.com/go-leo/gors/example/internal/app/api/svc"
)

func main() {
	engine := gin.New()
	engine = gors.AppendRoutes(engine, demo.ServiceRoutes(new(svc.Service))...)
	srv := http.Server{Handler: engine}
	listen, err := net.Listen("tcp", ":8088")
	if err != nil {
		panic(err)
	}
	err = srv.Serve(listen)
	if err != nil {
		panic(err)
	}
}

通过grpc定义接口有通过client和server两种启动方式

server方式:

package main

import (
	"github.com/go-leo/gors/example/api/protodemo"
	"github.com/go-leo/gors/example/internal/app/api/svc"
	"net"
	"net/http"

	"github.com/gin-gonic/gin"

	"github.com/go-leo/gors"
)

func main() {
	engine := gin.New()
	engine = gors.AppendRoutes(engine, protodemo.ProtoDemoServerRoutes(new(svc.HelloWorldService))...)
	srv := http.Server{Handler: engine}
	listen, err := net.Listen("tcp", ":8088")
	if err != nil {
		panic(err)
	}
	err = srv.Serve(listen)
	if err != nil {
		panic(err)
	}
}

client方式:

package main

import (
	"github.com/go-leo/gors/example/api/protodemo"
	"github.com/go-leo/gors/example/internal/app/api/svc"
	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials/insecure"
	"net"
	"net/http"
	"time"

	"github.com/gin-gonic/gin"

	"github.com/go-leo/gors"
)

func main() {
	go func() {
		server := grpc.NewServer()
		protodemo.RegisterProtoDemoServer(server, new(svc.ProtoDemoServer))
		listen, err := net.Listen("tcp", ":9090")
		if err != nil {
			panic(err)
		}
		err = server.Serve(listen)
		if err != nil {
			panic(err)
		}
	}()

	time.Sleep(time.Second)
	dial, err := grpc.Dial(":9090", grpc.WithTransportCredentials(insecure.NewCredentials()))
	if err != nil {
		panic(err)
	}
	client := protodemo.NewProtoDemoClient(dial)

	engine := gin.New()
	engine = gors.AppendRoutes(engine, protodemo.ProtoDemoClientRoutes(client)...)
	srv := http.Server{Handler: engine}
	listen, err := net.Listen("tcp", ":8088")
	if err != nil {
		panic(err)
	}
	err = srv.Serve(listen)
	if err != nil {
		panic(err)
	}
}

注意

通过Interface定义接口, 请求和响应参数需要满足一下:

  • 参数一:第一个参数必须是context.Context,其他类型都会生成失败。
  • 参数二: 第二个参数有四种类型:io.Reader[]bytestring结构体指针,其他类型都会生成失败。
    • io.Reader,直接取http.Request里的Body。只能支持@ReaderBinding
    • []byte,将http.Request里的Body以字节数组形式全部读出。只能支持@BytesBinding
    • string,将http.Request里的Body以字符串形式全部读出。只能支持@StringBinding
    • 结构体指针,支持除以上三种以外的所有Binding,将path、query、header和body中的参数,绑定到内部字段里。
  • 响应一:第一个响应参数有四种类型:string[]byteio.Reader结构体指针,其他类型都会生成失败。
    • io.Reader,将io.Reader写入响应的Body中,必须要配合@ReaderRender注解使用,可以自定义响应Content-Type,比如@ReaderRender(video/mpeg4)
    • []byte,将[]byte写入响应的Body中,必须要配合@BytesRender注解使用,可以自定义响应Content-Type,比如@BytesRender(image/png)
    • string,可以配合不同的Render策略进行响应。
      • @TextRender, 将文本以Content-Type"text/plain; charset=utf-8"写入响应的Body中。
      • @HTMLRender, 将文本以Content-Type"text/html; charset=utf-8"写入响应的Body中。
      • @StringRender, 将文本写入响应的Body中,可以自定义响应Content-Type,比如@StringRender(text/xml)
      • @RedirectRender, 重定向渲染,重定向到文本指定的位置。
    • 结构体指针,需要配合各自Render策略,将结构体指针序列化成[]byte后,写入响应的Body中。
  • 响应二:第一个请求参数必须是error,其他类型都会生成失败。

注解大全

@GORS

必须设置, 基础注解。 代表gors的注解配置的开始,没有@GORS开始的都会被忽略。

@Path

必须设置,路径注解。

  • 可以设置参数,@Path(/api)
  • 如果设置在接口名上,代表为所有path定义基础的path。
  • 如果设置在方法上,代表为此方法定义path。
  • 可以设置多个@Path注解,此时多个path会被拼接成一个。

HTTP Method注解

必须设置,设置此方法的只能响应指定的Method请求。 Method只能有一个有效,如果设置多个,只有最后一个有效。支持标准库里定义的9种method:

@GET

此注解设置此方法为Get请求。

@HEAD

此注解设置此方法为Head请求。

@POST

此注解设置此方法为Post请求。

@PUT

此注解设置此方法为Put请求。

@PATCH

此注解设置此方法为Patch请求。

@DELETE

此注解设置此方法为Delete请求。

@CONNECT

此注解设置此方法为Connect请求。

@OPTIONS

此注解设置此方法为Options请求。

@TRACE

此注解设置此方法为Trace请求。

Binding 注解

数据绑定注解。

  • 当第二个参数是结构体指针时候,可以设置。
  • 可以设置多种Binding策略。
@ReaderBinding

配合第二个参数是io.Reader类型使用,引用request.Body,可以设置Content-Type值,比如@ReaderBinding(image/jpeg)

  • grpc定义形式不支持
@BytesBinding

配合第二个参数是[]byte类型使用,将request.Body以字节形式全部读出,可以设置Content-Type值,比如@ReaderBinding(image/jpeg)

  • grpc定义形式不支持
@StringBinding

配合第二个参数是string类型使用,将request.Body以字节形式全部读出,并转成字符串,可以设置Content-Type值,比如@ReaderBinding(application/javascript)

  • grpc定义形式不支持
@UriBinding

将对应的Uri参数绑定到结构体指针中。 接口定义形式,默认的tag是uri,支持gin的路径参数语法gin的uri绑定策略

  • grpc定义形式,默认的tag是json
@QueryBinding

将对应的Query参数绑定到结构体指针中。

@HeaderBinding

将对应的Header参数绑定到结构体指针中。

@JSONBinding

将请求的Body以JSON形式解析出来,并绑定到结构体指针中。

  • 接口定义形式,默认的tag是json
  • grpc定义形式,默认的tag是json
@FormBinding

将请求的Query和Body同时以Form形式解析出来,并绑定到结构体指针中。

  • 接口定义形式,默认的tag是json,支持gin的form绑定策略
  • grpc定义形式,默认的tag是json
@FormPostBinding

将请求的Body以FormPost形式解析出来,并绑定到结构体指针中。

@FormMultipartBinding

将请求的Body以Multipart形式解析出来并绑定到结构体指针中。

@ProtoBufBinding

将请求的Body以protobuf形式解析出来并绑定到结构体指针中。

  • 接口定义形式,默认的tag是protobuf
  • grpc定义形式,默认的tag是protobuf
@ProtoJSONBinding

将请求的Body以protojson形式解析出来并绑定到结构体指针中。

  • 接口定义形式,默认的tag是json
  • grpc定义形式,默认的tag是json
@MsgPackBinding

将请求的Body以msgpack形式解析出来并绑定到结构体指针中。

  • 接口定义形式,默认的tag是codec
  • grpc定义形式,默认的tag是codec
@XMLBinding

将请求的Body以XML形式解析出来,并绑定到结构体指针中。

  • 接口定义形式,默认的tag是xml
  • grpc定义形式,默认的tag是xml
@YAMLBinding

将请求的Body以YAML形式解析出来并绑定到结构体指针中。

  • 接口定义形式,默认的tag是yaml
  • grpc定义形式,默认的tag是yaml
@TOMLBinding

将请求的Body以TOML形式解析出来并绑定到结构体指针中。

  • 接口定义形式,默认的tag是toml
  • grpc定义形式,默认的tag是toml
@CustomBinding

预定义的Binding策略不能满足需求,需要使用自定义Binding策略,请求结构体需要实现gors.Binding接口。

Render 注解

响应渲染注解。

  • 方法的一个返回参数的类型不通,相对应的渲染也不同。
  • 只能设置一种渲染策略。
@BytesRender

字节数组渲染。

只有当方法的第一个返回参数类型为[]byte时才能使用,@BytesRender将数据以字节数组写入响应的Body中,可以自定义响应Content-Type,比如:@BytesRender(image/png)代表渲染一张图片。

  • grpc定义形式不支持
@StringRender

字符串渲染。

只有当方法的第一个返回参数类型为string时才能使用,@StringRender将数据以文本的方式写入响应的Body中,可以自定义响应Content-Type,比如@StringRender(image/xml)代表渲染xml文件。

  • grpc定义形式不支持
@TextRender

文本渲染。

只有当方法的第一个返回参数类型为string时才能使用,@TextRender将数据以文本的方式写入响应的Body中,Content-Type固定为text/plain; charset=utf-8

  • grpc定义形式不支持
@HTMLRender

HTML渲染。

只有当方法的第一个返回参数类型为string时才能使用,@HTMLRender将数据以文本的方式写入响应的Body中,Content-Type固定为text/html; charset=utf-8

  • grpc定义形式不支持
@RedirectRender

重定向渲染。

只有当方法的第一个返回参数类型为string时才能使用,此参数应该是个可以重定向的地址位置。

  • grpc定义形式不支持
@ReaderRender

数据流渲染,只有当方法的第一个返回参数类型为io.Reader时才能使用,@ReaderRender将数据流写入响应的Body中,可以自定义响应Content-Type,比如:@ReaderRender(video/mpeg4)代表渲染一个视频文件。

  • grpc定义形式不支持
@JSONRender

JSON渲染。

只有当方法的第一个返回参数类型为结构体指针时才能使用,@JSONRender将结构体指针以JSON格式序列化并且写入响应的Body中,Content-Type固定为application/json; charset=utf-8。参考gin文档-json

@IndentedJSONRender

漂亮的JSON渲染,在JSON渲染的基础上,加上了缩进和结束行。

只有当方法的第一个返回参数类型为结构体指针时才能使用,@IndentedJSONRender将结构体指针以JSON格式序列化并且写入响应的Body中,Content-Type固定为application/json; charset=utf-8。比较耗资源。

@SecureJSONRender

安全的的JSON渲染,防止一些代码注入。

只有当方法的第一个返回参数类型为结构体指针时才能使用,@SecureJSONRender将结构体指针以JSON格式序列化并且写入响应的Body中,Content-Type固定为application/json; charset=utf-8gin文档-SecureJSON

@JsonpJSONRender

jsonp方式渲染,jsonp可以跨域请求,如果查询参数callback存在,则将callback添加到响应体中。

只有当方法的第一个返回参数类型为结构体指针时才能使用。参考gin文档-jsonp

  • grpc定义形式不支持
@PureJSONRender

纯净的JSON渲染,普通的JSON渲染,会将一些html特殊字符会被转义,比如<转成\u003c@PureJSONRender则不会转义。

只有当方法的第一个返回参数类型为结构体指针时才能使用,@PureJSONRender将结构体指针以JSON格式序列化并且写入响应的Body中,Content-Type固定为application/json; charset=utf-8gin文档-PureJSON

@AsciiJSONRender

AsciiJSON渲染,只渲染Ascii字符,非Ascii字符则会被转义。

只有当方法的第一个返回参数类型为结构体指针时才能使用,@AsciiJSONRender将结构体指针以JSON格式序列化并且写入响应的Body中,Content-Type固定为application/json; charset=utf-8gin文档-AsciiJSON

@ProtoJSONRender

ProtoJSON渲染,对protobuf已Json形式渲染

只有当方法的第一个返回参数类型为结构体指针时才能使用,@ProtoJSONRender将结构体指针以JSON格式序列化并且写入响应的Body中,Content-Type固定为application/json; charset=utf-8

@XMLRender

XML渲染。

只有当方法的第一个返回参数类型为结构体指针时才能使用,@XMLRender将结构体指针以XML格式序列化并且写入响应的Body中,Content-Type固定为application/xml; charset=utf-8。参考gin文档-XMLRender

@YAMLRender

YAML渲染。

只有当方法的第一个返回参数类型为结构体指针时才能使用,@YAMLRender将结构体指针以YAML格式序列化并且写入响应的Body中,Content-Type固定为application/x-yaml; charset=utf-8。参考gin文档-YAMLRender

@ProtoBufRender

ProtoBuf渲染。

只有当方法的第一个返回参数类型为结构体指针时才能使用,@ProtoBufRender将结构体指针以Protocol Buffer格式序列化并且写入响应的Body中,Content-Type固定为application/x-protobuf。参考gin文档-ProtoBufRender

@MsgPackRender

MsgPack渲染。

只有当方法的第一个返回参数类型为结构体指针时才能使用,@MsgPackRender将结构体指针以MsgPack格式序列化并且写入响应的Body中,Content-Type固定为application/msgpack; charset=utf-8

@TOMLRender

TOML渲染。

只有当方法的第一个返回参数类型为结构体指针时才能使用,@TOMLRender将结构体指针以TOML格式序列化并且写入响应的Body中,Content-Type固定为application/toml。参考gin文档-TOMLRender

@CustomRender

预定义的Render策略不能满足需求,需要使用自定义Render策略,响应结构体需要实现gors.Render接口。

Validate

除了gin框架支持的参数校验方案外,gors也提供了另外一种参数校验方式,方法的第一个返回参数类型为结构体指针,并且实现了Validator接口,则在数据绑定后,会对数据进行校验。

Validator接口

type Validator interface {
	Validate() error
}

Documentation

Index

Constants

View Source
const GorsMetadataPrefix = "gors-"

GorsMetadataPrefix is prepended to permanent HTTP header keys when added to the gRPC context.

View Source
const MetadataHeaderPrefix = "Grpc-Metadata-"

MetadataHeaderPrefix is the http prefix that represents custom metadata parameters to or from a gRPC call.

View Source
const MetadataTrailerPrefix = "Grpc-Trailer-"

MetadataTrailerPrefix is prepended to gRPC metadata as it is converted to HTTP headers in a response handled by grpc-gateway

Variables

View Source
var (
	UnknownStatusCode = 500
	UnknownCode       = 100001
	UnknownMessage    = "An internal server error occurred"
)

全局默认错误码,可以自定义覆盖

View Source
var DefaultContextTimeout = 0 * time.Second

DefaultContextTimeout is used for gRPC call context.WithTimeout whenever a Grpc-Timeout inbound header isn't present. If the value is 0 the sent `context` will not have a timeout.

Functions

func AddGRPCMetadata added in v1.3.0

func AddGRPCMetadata(
	ctx context.Context,
	headerMD, trailerMD metadata.MD,
	headerMatcher func(key string) (string, bool),
)

func AppendRichRoutes added in v1.1.1

func AppendRichRoutes[R gin.IRoutes](iRoutes R, routes ...RichRoute) R

AppendRichRoutes 追加富路由

func AppendRoutes added in v1.1.1

func AppendRoutes[R gin.IRoutes](iRoutes R, routes ...Route) R

AppendRoutes 追加基础路由

func AsciiJSONRender added in v1.3.0

func AsciiJSONRender(ctx context.Context, code int, resp any, _ string)

func BytesBinding added in v1.3.2

func BytesBinding(ctx context.Context, req any, tag string) error

func BytesRender added in v1.3.0

func BytesRender(ctx context.Context, code int, resp any, contentType string)

func CustomBinding added in v1.3.0

func CustomBinding(ctx context.Context, req any, _ string) error

func CustomRender added in v1.3.0

func CustomRender(ctx context.Context, code int, resp any, _ string)

func ErrorRender added in v1.3.0

func ErrorRender(
	ctx context.Context,
	err error,
	handler func(ctx context.Context, err error) error,
	wrapper func(resp any) any,
)

func FormBinding added in v1.3.0

func FormBinding(ctx context.Context, req any, tag string) error

func FormMultipartBinding added in v1.3.0

func FormMultipartBinding(ctx context.Context, req any, tag string) error

func FormPostBinding added in v1.3.0

func FormPostBinding(ctx context.Context, req any, tag string) error

func FromContext

func FromContext(ctx context.Context) *gin.Context

FromContext 从context获取gin.Contenxt

func HTMLRender added in v1.3.0

func HTMLRender(ctx context.Context, code int, resp any, _ string)
func Header(ctx context.Context) http.Header

Header 从context获取header

func HeaderBinding added in v1.3.0

func HeaderBinding(ctx context.Context, req any, tag string) error

func IndentedJSONRender added in v1.3.0

func IndentedJSONRender(ctx context.Context, code int, resp any, _ string)

func JSONBinding added in v1.3.0

func JSONBinding(ctx context.Context, req any, _ string) error

func JSONPJSONRender added in v1.3.0

func JSONPJSONRender(ctx context.Context, code int, resp any, _ string)

func JSONRender added in v1.3.0

func JSONRender(ctx context.Context, code int, resp any, _ string)

func MsgPackBinding added in v1.3.0

func MsgPackBinding(ctx context.Context, req any, _ string) error

func MsgPackRender added in v1.3.0

func MsgPackRender(ctx context.Context, code int, resp any, _ string)

func NewContext

func NewContext(c *gin.Context, rpcMethodName string) context.Context

NewContext 向context注入gin.Context

func NewGRPCContext added in v1.3.0

func NewGRPCContext(
	ctx context.Context,
	headerMatcher func(key string) (string, bool),
	metadataAnnotators []func(ctx context.Context) metadata.MD,
) (context.Context, error)

NewGRPCContext adds context information such as metadata from the request. At a minimum, the RemoteAddr is included in the fashion of "X-Forwarded-For", except that the forwarded destination is not another HTTP service but rather a gRPC service.

func ProtoBufBinding added in v1.3.0

func ProtoBufBinding(ctx context.Context, req any, _ string) error

func ProtoBufRender added in v1.3.0

func ProtoBufRender(ctx context.Context, code int, resp any, _ string)

func ProtoJSONBinding added in v1.3.0

func ProtoJSONBinding(ctx context.Context, req any, _ string) error

func ProtoJSONRender added in v1.3.0

func ProtoJSONRender(ctx context.Context, code int, resp any, _ string)

func PureJSONRender added in v1.3.0

func PureJSONRender(ctx context.Context, code int, resp any, _ string)

func QueryBinding added in v1.3.0

func QueryBinding(ctx context.Context, req any, tag string) error

func RPCMethod added in v1.3.0

func RPCMethod(ctx context.Context) (string, bool)

RPCMethod returns the method string for the server context. The returned string is in the format of "/package.Service/method".

func ReaderBinding added in v1.3.2

func ReaderBinding(ctx context.Context, req any, _ string) error

func ReaderRender added in v1.3.0

func ReaderRender(ctx context.Context, code int, resp any, contentType string)

func RedirectRender added in v1.3.0

func RedirectRender(ctx context.Context, code int, resp any, _ string)

func RequestBind added in v1.3.0

func RequestBind(ctx context.Context, req any, tag string, bindings ...func(ctx context.Context, req any, tag string) error) error

func ResponseRender added in v1.3.0

func ResponseRender(
	ctx context.Context,
	code int,
	resp any,
	contentType string,
	render func(ctx context.Context, code int, resp any, contentType string),
	wrapper func(resp any) any,
)

func SecureJSONRender added in v1.3.0

func SecureJSONRender(ctx context.Context, code int, resp any, _ string)

func SetHeader added in v1.3.0

func SetHeader(ctx context.Context, header http.Header)

SetHeader 向context设置header

func SetStatusCode added in v1.3.0

func SetStatusCode(ctx context.Context, code int)

SetStatusCode 向context设置status code

func SetTrailer added in v1.3.0

func SetTrailer(ctx context.Context, trailer http.Header)

SetTrailer 向context设置trailer

func StatusCode added in v1.3.0

func StatusCode(ctx context.Context) int

StatusCode 从context获取status code

func StringBinding added in v1.3.2

func StringBinding(ctx context.Context, req any, tag string) error

func StringRender added in v1.3.0

func StringRender(ctx context.Context, code int, resp any, contentType string)

func TOMLBinding added in v1.3.0

func TOMLBinding(ctx context.Context, req any, _ string) error

func TOMLRender added in v1.3.0

func TOMLRender(ctx context.Context, code int, resp any, _ string)

func TextRender added in v1.3.0

func TextRender(ctx context.Context, code int, resp any, _ string)

func Trailer added in v1.3.0

func Trailer(ctx context.Context) http.Header

Trailer 从context获取trailer

func UriBinding added in v1.3.0

func UriBinding(ctx context.Context, req any, tag string) error

func Validate

func Validate(req interface{}) error

func XMLBinding added in v1.3.0

func XMLBinding(ctx context.Context, req any, _ string) error

func XMLRender added in v1.3.0

func XMLRender(ctx context.Context, code int, resp any, _ string)

func YAMLBinding added in v1.3.0

func YAMLBinding(ctx context.Context, req any, _ string) error

func YAMLRender added in v1.3.0

func YAMLRender(ctx context.Context, code int, resp any, _ string)

Types

type Binding added in v1.2.0

type Binding interface {
	Bind(ctx context.Context) error
}

Binding 如果请求参数struct实现Binding接口,框架会用自定义绑定逻辑来绑定请求参数

type Empty added in v1.4.4

type Empty struct{}

type Error added in v1.3.0

type Error struct {
	// StatusCode http status code
	StatusCode int
	// Code business service code
	Code int
	// Message error message
	Message string
	// Cause error
	Cause error
}

Error 包含业务状态的错误.

func ErrorFromMessage added in v1.3.0

func ErrorFromMessage(msg string) (Error, bool)

func FromError added in v1.4.6

func FromError(err error) Error

FromError 解析error为 Error. 解析 Error 或者 status.Status 为 Error, 其他类型的error返回 UnknownError.

func (Error) Error added in v1.3.0

func (e Error) Error() string

func (Error) Format added in v1.4.6

func (e Error) Format(s fmt.State, verb rune)

Format nolint: errcheck // WriteString could no check in pkg.

func (Error) Froze added in v1.4.6

func (e Error) Froze() error

Froze convert Error to error

func (Error) GRPCStatus added in v1.4.6

func (e Error) GRPCStatus() *gstatus.Status

GRPCStatus returns the Status represented by gors.Error.

func (Error) Is added in v1.4.6

func (e Error) Is(err error) bool

Is matches each error in the chain with the target value.

func (Error) Status added in v1.3.0

func (e Error) Status() *Status

func (Error) Unwrap added in v1.4.6

func (e Error) Unwrap() error

Unwrap provides compatibility for Go 1.13 error chains.

type Option added in v1.3.0

type Option func(o *Options)

func ErrorHandler added in v1.3.0

func ErrorHandler(h func(ctx context.Context, err error) error) Option

func IncomingHeaderMatcher added in v1.3.0

func IncomingHeaderMatcher(m func(key string) (string, bool)) Option

func MetadataAnnotator added in v1.3.0

func MetadataAnnotator(a ...func(ctx context.Context) metadata.MD) Option

func OutgoingHeaderMatcher added in v1.3.0

func OutgoingHeaderMatcher(m func(key string) (string, bool)) Option

func ResponseWrapper added in v1.3.0

func ResponseWrapper(w func(resp any) any) Option

func Tag added in v1.3.0

func Tag(tag string) Option

type Options added in v1.3.0

type Options struct {
	Tag                   string
	ResponseWrapper       func(resp any) any
	ErrorHandler          func(ctx context.Context, err error) error
	IncomingHeaderMatcher func(key string) (string, bool)
	OutgoingHeaderMatcher func(key string) (string, bool)
	MetadataAnnotators    []func(ctx context.Context) metadata.MD
}

func NewOptions added in v1.4.3

func NewOptions(opts ...Option) *Options

type Render added in v1.2.0

type Render interface {
	Render(ctx context.Context)
}

Render 如果响应参数struct实现Render接口,框架会用自定义渲染逻辑来渲染响应参数

type RichRoute added in v1.1.1

type RichRoute interface {
	Method() string
	Path() string
	Handlers() []gin.HandlerFunc
}

RichRoute 富路由,在 Route 基础上,为路由增加了中间件功能。

func NewRichRoute added in v1.1.1

func NewRichRoute(route Route, middlewares ...gin.HandlerFunc) RichRoute

NewRichRoute 创建一个富路由

func NewRichRoutes added in v1.2.0

func NewRichRoutes(routes []Route, middlewares ...gin.HandlerFunc) []RichRoute

NewRichRoutes 创建一个多个富路由

type Route

type Route interface {
	Method() string
	Path() string
	Handler() gin.HandlerFunc
}

Route 基础路由,定义一个接口路由,包括method、path和处理器

func NewRoute

func NewRoute(method string, path string, handler gin.HandlerFunc) Route

NewRoute 创建一个路由

type ServerTransportStream added in v1.3.0

type ServerTransportStream struct {
	// contains filtered or unexported fields
}

ServerTransportStream implements grpc.ServerTransportStream. It should only be used by the generated files to support grpc.SendHeader outside of gRPC server use.

func NewServerTransportStream added in v1.3.0

func NewServerTransportStream(method string) *ServerTransportStream

func (*ServerTransportStream) Header added in v1.3.0

func (s *ServerTransportStream) Header() metadata.MD

Header returns the header metadata of the stream.

func (*ServerTransportStream) Method added in v1.3.0

func (s *ServerTransportStream) Method() string

func (*ServerTransportStream) SendHeader added in v1.3.0

func (s *ServerTransportStream) SendHeader(md metadata.MD) error

func (*ServerTransportStream) SetHeader added in v1.3.0

func (s *ServerTransportStream) SetHeader(md metadata.MD) error

SetHeader sets the header metadata.

func (*ServerTransportStream) SetTrailer added in v1.3.0

func (s *ServerTransportStream) SetTrailer(md metadata.MD) error

SetTrailer sets the trailer metadata.

func (*ServerTransportStream) Trailer added in v1.3.0

func (s *ServerTransportStream) Trailer() metadata.MD

Trailer returns the cached trailer metadata.

type Status added in v1.3.0

type Status struct {
	Code    int    `` /* 139-byte string literal not displayed */
	Message string `` /* 157-byte string literal not displayed */
}

Status 代表业务状态信息.

type Validator

type Validator interface {
	Validate() error
}

Validator 如果请求参数struct实现Validator接口,框架会验证数据

Directories

Path Synopsis
cmd
gors-error
Package main is a tool to automate the creation of code init function.
Package main is a tool to automate the creation of code init function.
example
api/errors
Code generated by "gors-error -type=int "; DO NOT EDIT.
Code generated by "gors-error -type=int "; DO NOT EDIT.
internal

Jump to

Keyboard shortcuts

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