gRPC(可选)
gRPC 结果处理
xGrpcResult 包提供统一的 gRPC 响应构建函数
xGrpcResult 包
xGrpcResult 包提供统一的 gRPC 响应构建函数,基于内置 BaseResponse proto 消息封装。
import xGrpcResult "github.com/bamboo-services/bamboo-base-go/plugins/grpc/result"Success
返回无数据的成功响应,填充 Output、Code、Message 三个业务语义字段。
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 定义示例
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 构建。