/internal/server/http.go自定义响应格式、错误optsappend(opts,http.ResponseEncoder(responseEncoder))optsappend(opts,http.ErrorEncoder(errorEncoder))/internal/server/httpencoder.go上面的自定义内容写在下面packageserverimport(net/httpkratoshttpgithub.com/go-kratos/kratos/v2/transport/httpkaratosstatusgithub.com/go-kratos/kratos/v2/transport/http/statusgoogle.golang.org/grpc/status)typehttpResponsestruct{Codeintjson:codeMsgstringjson:msgData anyjson:data}funcresponseEncoder(w http.ResponseWriter,r*http.Request,vinterface{})error{ifvnil{returnnil}ifrd,ok:v.(kratoshttp.Redirector);ok{url,code:rd.Redirect()http.Redirect(w,r,url,code)returnnil}codec,_:kratoshttp.CodecForRequest(r,Accept)res:httpResponse{Code:http.StatusOK,Msg:success,Data:v,}data,err:codec.Marshal(res)iferr!nil{returnerr}w.Header().Set(Content-Type,application/codec.Name())_,errw.Write(data)iferr!nil{returnerr}returnnil}// ⾃自定义的错误响应编码器器funcerrorEncoder(w http.ResponseWriter,r*http.Request,errerror){iferrnil{return}resp:new(httpResponse)// 能从err⾥里里⾯面解析出错误码的ifgs,ok:status.FromError(err);ok{resphttpResponse{Code:karatosstatus.FromGRPCCode(gs.Code()),Msg:gs.Message(),Data:nil,}}else{resphttpResponse{Code:http.StatusInternalServerError,// 500Msg:内部错误,}}codec,_:kratoshttp.CodecForRequest(r,Accept)body,err:codec.Marshal(resp)iferr!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/v2latest②、定义好proto后windows执行生成命令protoc --proto_path. --proto_path./third_party --go_outpathssource_relative:. --go-errors_outpathssource_relative:. api/bubble/v1/todo_error.protosyntaxproto3;packageapi.bubble.v1;importerrors/errors.proto;option go_packagebubble/api/bubble/v1;v1;option java_multiple_filestrue;option java_packageapi.bubble.v1;enum ErrorReason{// 设置缺省错误码option(errors.default_code)500;// 为某个枚举单独设置错误码TODO_NOT_FOUND0[(errors.code)404];INVALID_PARAM1[(errors.code)400];}