自定义响应体
server/http_codec.go
package server
import ( "fmt" "net/http"
krhttp "github.com/go-kratos/kratos/v2/transport/http")
type Response struct { Code int `json:"code,omitempty"` Msg string `json:"msg,omitempty"` Data any `json:"data,omitempty"`}
// CustomResponseEncoder 自定义编码器, 统一的响应结构体func CustomResponseEncoder(w http.ResponseWriter, r *http.Request, v any) error { if v == nil { return nil } // 判断是否重定向 if rd, ok := v.(krhttp.Redirector); ok { url, code := rd.Redirect() http.Redirect(w, r, url, code) return nil } codec, _ := krhttp.CodecForRequest(r, "Accept")
response := &Response{ Code: http.StatusOK, Msg: "success", Data: v, }
data, err := codec.Marshal(response) if err != nil { return err } // 设置响应头 Content-Type: application/json w.Header().Set("Content-Type", fmt.Sprintf("application/%s", codec.Name())) _, err = w.Write(data) return err}server/http.go
// 替换默认的HTTP编码器 opts = append(opts, http.ResponseEncoder(CustomResponseEncoder))