必须注册自定义codec才能支持json以外的请求体格式;需先导入encoding包触发codec注册,再实现并注册xml等codec,最后在http服务中通过content-type自动匹配。

要在Kratos中支持JSON以外的请求体格式(比如XML、YAML或自定义二进制协议),必须注册自定义Codec,否则框架无法识别Content-Type并反序列化请求数据。
确认encoding模块已启用
检查项目是否已导入github.com/go-kratos/kratos/v2/encoding包。若未显式引入,需在main.go或初始化逻辑中添加_ "github.com/go-kratos/kratos/v2/encoding/json"等默认codec导入——这是触发内部codec注册的必要前提,【缺少该导入会导致RegisterCodec调用静默失效】。
编写自定义Codec实现
创建encoding/xml/xml.go文件,定义XML编解码器:
实现encoding.Codec接口的Marshal和Unmarshal方法,同时指定ContentType返回"application/xml";注意Unmarshal需兼容io.Reader输入,且错误处理要返回errors.Is(err, io.EOF)兼容性判断。
注册Codec到全局编码器池
在服务启动前(如cmd/server/main.go的init()函数或wire.go中)调用:
encoding.RegisterCodec("xml", &xml.Codec{})
这一步必须在http.NewServer或grpc.NewServer创建之前完成,否则transport层初始化时读不到新codec。
在HTTP Server中启用该格式
修改internal/server/http.go中http.NewServer的配置:
传入http.WithEncoder(func(ctx context.Context, w http.ResponseWriter, r *http.Request, v any) error { ... })可覆盖默认行为;但更推荐保持默认encoder,仅确保请求头含Accept: application/xml或Content-Type: application/xml,框架会自动匹配已注册的xml codec。
验证方式:启动服务后发送curl -H "Content-Type: application/xml" -d '<user><id>123</id></user>' http://localhost:8000/user,观察日志是否成功解析结构体字段。











