go的 kratos的http自定义(响应)信息

  • /internal/server/http.go

自定义:响应格式、错误

go 复制代码
opts = append(opts, http.ResponseEncoder(responseEncoder))
opts = append(opts, http.ErrorEncoder(errorEncoder))
  • /internal/server/httpencoder.go

上面的:自定义内容,写在下面

go 复制代码
package server

import (
	"net/http"

	kratoshttp "github.com/go-kratos/kratos/v2/transport/http"
	karatosstatus "github.com/go-kratos/kratos/v2/transport/http/status"
	"google.golang.org/grpc/status"
)

type httpResponse struct {
	Code int `json:"code"`
	Msg string `json:"msg"`
	Data any `json:"data"`
}

func responseEncoder(w http.ResponseWriter, r *http.Request, v interface{}) error {
	if v == nil {
		return nil
	}
	if rd, ok := v.(kratoshttp.Redirector); ok {
		url, code := rd.Redirect()
		http.Redirect(w, r, url, code)
		return nil
	}
	codec, _ := kratoshttp.CodecForRequest(r, "Accept")

	res := &httpResponse{
		Code: http.StatusOK,
		Msg: "success",
		Data: v,
	}

	data, err := codec.Marshal(res)
	if err != nil {
		return err
	}
	w.Header().Set("Content-Type", "application/" + codec.Name())
	_, err = w.Write(data)
	if err != nil {
		return err
	}
	return nil
}


// ⾃自定义的错误响应编码器器
func errorEncoder(w http.ResponseWriter, r *http.Request, err error) {
	if err == nil {
		return
	}
	resp := new(httpResponse)
	// 能从err⾥里里⾯面解析出错误码的
	if gs, ok := status.FromError(err); ok {
		resp = &httpResponse{
			Code: karatosstatus.FromGRPCCode(gs.Code()),
			Msg: gs.Message(),
			Data: nil,
		}
	} else {
		resp = &httpResponse{
			Code: http.StatusInternalServerError, // 500
			Msg: "内部错误",
		}
	}
	codec, _ := kratoshttp.CodecForRequest(r, "Accept")
	body, err := codec.Marshal(resp)
	if err != nil {
		w.WriteHeader(http.StatusInternalServerError)
		return
	}
	w.Header().Set("Content-Type", "application/"+codec.Name())
	w.WriteHeader(resp.Code)
	_, _ = w.Write(body)
}
  • /api/bubble/v1/todo_error.proto

自定义状态码

①、安装依赖:go install github.com/go-kratos/kratos/cmd/protoc-gen-go-errors/v2@latest

②、定义好proto后,windows执行生成命令

protoc --proto_path=. --proto_path=./third_party --go_out=paths=source_relative:. --go-errors_out=paths=source_relative:. api/bubble/v1/todo_error.proto

go 复制代码
syntax = "proto3";
package api.bubble.v1;
import "errors/errors.proto";

option go_package = "bubble/api/bubble/v1;v1";
option java_multiple_files = true;
option java_package = "api.bubble.v1";

enum ErrorReason {
  // 设置缺省错误码
  option (errors.default_code) = 500;
  // 为某个枚举单独设置错误码
  TODO_NOT_FOUND = 0 [(errors.code) = 404];
  INVALID_PARAM = 1 [(errors.code) = 400];
}
相关推荐
紧跟先前的步伐14 小时前
Go AI Agent 实战 22|完善 Agent 执行循环:从工具调用到最终回答
人工智能·ai·golang
后台模板学习15 小时前
Go Web开发中任务调度框架的源码解析与高可用实现方案
开发语言·后端·golang
FungLeo15 小时前
成为全栈·Go 后端篇·分类树与标签关系:目录变更为何需要协调
golang·go·gorm·数据库事务·分类树·成为全栈
fly-iot16 小时前
【FDE知识库】(1):AI 编程时代开发语言选型分析,云使用go,企业用java,算法python,底层c
开发语言·人工智能·golang
FungLeo16 小时前
成为全栈·Go 后端篇·文章查询与展示投影:安全分页、排序和软删除
golang·go·gorm·分页查询·成为全栈·sql安全
紧跟先前的步伐1 天前
Go AI Agent 实战 24|工具系统工程化收尾与阶段验收
人工智能·ai·golang·1024程序员节
日日大王学编程1 天前
#Feed 流项目复盘:Redis 时间线缓存与 Outbox 消息可靠性设计
golang·1024程序员节
北冥you鱼1 天前
Go 语言 CRUD 实战:从接口设计到真实业务场景
开发语言·后端·golang
利威尔xu2 天前
Go IM 源码实战(11):token 只是个 HASH,多端互踢的顺序错了就踢错人
后端·微服务·面试·架构·golang
microrain2 天前
SagooIoT 把协议解析和消息通知都放进了独立进程
物联网·golang·插件·sagooiot