竹简文档
gRPC(可选)

gRPC 结果处理

xGrpcResult 包提供统一的 gRPC 响应构建函数

xGrpcResult 包

xGrpcResult 包提供统一的 gRPC 响应构建函数,基于内置 BaseResponse proto 消息封装。

import xGrpcResult "github.com/bamboo-services/bamboo-base-go/plugins/grpc/result"

Success

返回无数据的成功响应,填充 OutputCodeMessage 三个业务语义字段。

func Success(ctx context.Context, message string) *xGrpcGenerate.BaseResponse

请求追踪 ID(context)和耗时(overhead)由 ResponseBuilder 拦截器统一注入,无需手动填写。

示例:

func (s *UserServer) DeleteUser(ctx context.Context, req *pb.DeleteUserRequest) (*xGrpcGenerate.BaseResponse, error) {
    xErr := s.service.Delete(ctx, req.Id)
    if xErr != nil {
        return nil, xErr
    }
    return xGrpcResult.Success(ctx, "删除成功"), nil
}

SuccessWith[T]

泛型函数,创建包含业务数据的成功响应,通过反射自动注入 BaseResponse 字段。

func SuccessWith[T any](ctx context.Context, message string) T

类型约束

  • T 必须是指针类型(如 *pb.YourResponse)。
  • T 指向的结构体中必须包含名为 BaseResponse、类型为 *xGrpcGenerate.BaseResponse 的字段。
  • 若不满足条件,函数会 panic 以在开发阶段尽早暴露错误。

工作原理

SuccessWith[*pb.YourResponse](ctx, "操作成功")

reflect.New(YourResponse{})

设置 BaseResponse 字段 = &BaseResponse{Output: "Success", Code: 200, Message: "操作成功"}

返回 *pb.YourResponse(调用者继续填充业务字段)

Proto 定义示例

proto/upload.proto
syntax = "proto3";

package yourService;

import "link/base.proto";

option go_package = "./internal/proto/api;bGrpcApi";

message UploadResponse {
  xBase.BaseResponse base_response = 1;
  string file_id = 2;
  string file_url = 3;
  int64 file_size = 4;
}

Handler 使用示例

func (s *FileServer) Upload(ctx context.Context, req *pb.UploadRequest) (*pb.UploadResponse, error) {
    result, xErr := s.service.Upload(ctx, req.FileName, req.Content)
    if xErr != nil {
        return nil, xErr
    }

    resp := xGrpcResult.SuccessWith[*pb.UploadResponse](ctx, "上传成功")
    resp.FileId = result.ID
    resp.FileUrl = result.URL
    resp.FileSize = result.Size
    return resp, nil
}

完整 Handler 示例

展示新版错误处理模式:业务 handler 直接返回 *xError.Error,由 ResponseBuilder 拦截器统一转换。

func (s *OrderServer) CreateOrder(ctx context.Context, req *pb.CreateOrderRequest) (*xGrpcGenerate.BaseResponse, error) {
    // 参数校验
    if req.UserId == 0 {
        return nil, xError.NewError(ctx, xError.BadRequest, "用户 ID 不能为空", false)
    }

    // 调用 service(错误直接返回,ResponseBuilder 负责转换)
    xErr := s.service.CreateOrder(ctx, req.UserId, req.Amount)
    if xErr != nil {
        return nil, xErr
    }

    // 成功响应
    return xGrpcResult.Success(ctx, "订单创建成功"), nil
}

重要:错误处理由 ResponseBuilder 拦截器统一负责。handler 中只需将 *xError.Error 作为 error 返回,拦截器会自动完成错误码映射和 gRPC status 构建。

下一步

On this page