希曼日记

自定义响应体

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