跳到主要内容

自定义响应体

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))

效果: ![[Pasted image 20250828124737.png]]