diff --git a/.gitignore b/.gitignore index 4befed3..7ba9c63 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ .DS_Store .idea +test_marshaler.go \ No newline at end of file diff --git a/api/grpc_gateway/mux.go b/api/grpc_gateway/mux.go index c9bcf76..af5c73b 100644 --- a/api/grpc_gateway/mux.go +++ b/api/grpc_gateway/mux.go @@ -22,6 +22,17 @@ var DefaultServeMuxOption = []runtime.ServeMuxOption{ runtime.WithErrorHandler(DefaultErrorHandler), runtime.WithRoutingErrorHandler(DefaultRoutingErrorHandler), runtime.WithIncomingHeaderMatcher(DefaultHeaderWarp), + // 标准 JSON 格式 + runtime.WithMarshalerOption("application/json", &runtime.JSONPb{ + MarshalOptions: protojson.MarshalOptions{ + EmitUnpopulated: true, + UseProtoNames: true, + }, + UnmarshalOptions: protojson.UnmarshalOptions{ + DiscardUnknown: false, + }, + }), + // Protobuf JSON 格式 runtime.WithMarshalerOption("application/jsonpb", &runtime.JSONPb{ MarshalOptions: protojson.MarshalOptions{ EmitUnpopulated: true, @@ -31,6 +42,16 @@ var DefaultServeMuxOption = []runtime.ServeMuxOption{ DiscardUnknown: false, }, }), + // 兜底方案:客户端没明确指定 Content-Type 时用这个 + runtime.WithMarshalerOption(runtime.MIMEWildcard, &runtime.JSONPb{ + MarshalOptions: protojson.MarshalOptions{ + EmitUnpopulated: true, + UseProtoNames: true, + }, + UnmarshalOptions: protojson.UnmarshalOptions{ + DiscardUnknown: false, + }, + }), } func NewMixedPortServeMux(ctx context.Context, endpoint string, registers ...Register) (*runtime.ServeMux, error) {