You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

httpResult.go 3.4 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. package result
  2. import (
  3. "context"
  4. "fmt"
  5. "github.com/pkg/errors"
  6. "github.com/zeromicro/go-zero/core/logx"
  7. "github.com/zeromicro/go-zero/rest/httpx"
  8. "gitlink.org.cn/jcce-pcm/pcm-coordinator/pkg/helper/xerr"
  9. "gitlink.org.cn/jcce-pcm/pcm-coordinator/pkg/utils"
  10. "go.opentelemetry.io/otel/trace"
  11. "google.golang.org/grpc/status"
  12. "net/http"
  13. )
  14. type Body struct {
  15. Code int `json:"code"`
  16. Msg string `json:"msg"`
  17. Data interface{} `json:"data,omitempty"`
  18. TraceID string `json:"traceId,omitempty"`
  19. }
  20. // http返回
  21. func HttpResult(r *http.Request, w http.ResponseWriter, resp interface{}, err error) {
  22. if err == nil {
  23. //成功返回
  24. body := Body{}
  25. utils.Convert(resp, &body)
  26. if body.Msg == "" && body.Code == 0 {
  27. body.Code = 200
  28. body.Msg = "success"
  29. body.TraceID = traceIDFromContext(r.Context())
  30. body.Data = resp
  31. httpx.OkJson(w, body)
  32. return
  33. } else {
  34. body.TraceID = traceIDFromContext(r.Context())
  35. httpx.OkJson(w, body)
  36. }
  37. } else {
  38. //错误返回
  39. errcode := xerr.SERVER_COMMON_ERROR
  40. errmsg := "服务器开小差啦,稍后再来试一试"
  41. causeErr := errors.Cause(err) // err类型
  42. if e, ok := causeErr.(*xerr.CodeError); ok { //自定义错误类型
  43. //自定义CodeError
  44. errcode = e.GetErrCode()
  45. errmsg = e.GetErrMsg()
  46. } else if gstatus, ok := status.FromError(causeErr); ok { // grpc err错误
  47. grpcCode := uint32(gstatus.Code())
  48. if xerr.IsCodeErr(grpcCode) { //区分自定义错误跟系统底层、db等错误,底层、db错误不能返回给前端
  49. errcode = grpcCode
  50. errmsg = gstatus.Message()
  51. } else {
  52. errmsg = err.Error()
  53. }
  54. } else { //返回原始错误
  55. errmsg = err.Error()
  56. }
  57. logx.WithContext(r.Context()).Errorf("【API-ERR】 : %+v ", err)
  58. httpx.WriteJson(w, http.StatusBadRequest, Error(errcode, errmsg, r.Context()))
  59. }
  60. }
  61. // 授权的http方法
  62. func AuthHttpResult(r *http.Request, w http.ResponseWriter, resp interface{}, err error) {
  63. if err == nil {
  64. //成功返回
  65. r := Success(resp, r.Context())
  66. httpx.WriteJson(w, http.StatusOK, r)
  67. } else {
  68. //错误返回
  69. errcode := xerr.SERVER_COMMON_ERROR
  70. errmsg := "服务器开小差啦,稍后再来试一试"
  71. causeErr := errors.Cause(err) // err类型
  72. if e, ok := causeErr.(*xerr.CodeError); ok { //自定义错误类型
  73. //自定义CodeError
  74. errcode = e.GetErrCode()
  75. errmsg = e.GetErrMsg()
  76. } else {
  77. if gstatus, ok := status.FromError(causeErr); ok { // grpc err错误
  78. grpcCode := uint32(gstatus.Code())
  79. if xerr.IsCodeErr(grpcCode) { //区分自定义错误跟系统底层、db等错误,底层、db错误不能返回给前端
  80. errcode = grpcCode
  81. errmsg = gstatus.Message()
  82. }
  83. }
  84. }
  85. logx.WithContext(r.Context()).Errorf("【GATEWAY-ERR】 : %+v ", err)
  86. httpx.WriteJson(w, http.StatusUnauthorized, Error(errcode, errmsg, r.Context()))
  87. }
  88. }
  89. // http 参数错误返回
  90. func ParamErrorResult(r *http.Request, w http.ResponseWriter, err error) {
  91. errMsg := fmt.Sprintf("%s ,%s", xerr.MapErrMsg(xerr.REUQEST_PARAM_ERROR), err.Error())
  92. httpx.WriteJson(w, http.StatusBadRequest, Error(xerr.REUQEST_PARAM_ERROR, errMsg, r.Context()))
  93. }
  94. func traceIDFromContext(ctx context.Context) string {
  95. spanCtx := trace.SpanContextFromContext(ctx)
  96. if spanCtx.HasTraceID() {
  97. return spanCtx.TraceID().String()
  98. }
  99. return ""
  100. }

PCM is positioned as Software stack over Cloud, aiming to build the standards and ecology of heterogeneous cloud collaboration for JCC in a non intrusive and autonomous peer-to-peer manner.