首页 > 其他分享 >goframe API 自定义接口返回值处理

goframe API 自定义接口返回值处理

时间:2023-05-22 23:12:36浏览次数:44  
标签:ghttp code err 自定义 gcode goframe API msg Response

前言

goframe 默认使用了中间键 ghttp.MiddlewareHandlerResponse, HTTP Server 的数据返回通过 ghttp.Response 对象实现,ghttp.Response 对象实现了标准库的 http.ResponseWriter 接口。数据输出使用 Write* 相关方法实现,并且数据输出采用了 Buffer 机制,因此数据的处理效率比较高。

如果这时候我们想修改它的默认统一返回值处理,可以根据业务需要重写中间键,以下是在 ghttp.MiddlewareHandlerResponse 的基础上修改。

更改默认Middleware

goframe 默认使用了中间键 ghttp.MiddlewareHandlerResponse, 我们可以把这个中间键复制一份,重新建立一个中间键:

// DefaultHandlerResponse is the default implementation of HandlerResponse.
type DefaultHandlerResponse struct {
	Code    int         `json:"code"    dc:"Error code"`
	Message string      `json:"msg" dc:"Error message"`
	Data    interface{} `json:"data"    dc:"Result data for certain request according API definition"`
}

func MiddlewareResponseHandler(r *ghttp.Request) {
	r.Middleware.Next()

	if r.Response.BufferLength() > 0 {
		return
	}

	var (
		msg  string
		err  = r.GetError()
		res  = r.GetHandlerResponse()
		code = gerror.Code(err)
	)
	if err != nil {
		if code == gcode.CodeNil {
			code = gcode.CodeInternalError
		}
		msg = err.Error()
	} else {
		if r.Response.Status > 0 && r.Response.Status != http.StatusOK {
			msg = http.StatusText(r.Response.Status)
			switch r.Response.Status {
			case http.StatusNotFound:
				code = gcode.CodeNotFound
			case http.StatusForbidden:
				code = gcode.CodeNotAuthorized
			default:
				code = gcode.CodeUnknown
			}
			// It creates error as it can be retrieved by other middlewares.
			err = gerror.NewCode(code, msg)
			r.SetError(err)
		} else {
			code = gcode.CodeOK
		}
	}
	r.Response.WriteJson(DefaultHandlerResponse{
		Code:    code.Code(),
		Message: msg,
		Data:    res,
	})
}

这里的中间键,我只修改了默认返回的 DefaultHandlerResponse,达到了自定义返回值处理的目的。

修改项目中 internal/cmd/cmd.go中,group.Middleware(ghttp.MiddlewareHandlerResponse),改为自己的中间键 group.Middleware( MiddlewareResponseHandler)

标签:ghttp,code,err,自定义,gcode,goframe,API,msg,Response
From: https://www.cnblogs.com/niuben/p/17422011.html

相关文章

  • 深入理解Kube-APIServer
    深入理解Kube-APIServer¶目录-认证-鉴权-准入MutatingValidatingAdmission-限流-APIServer对象的实现APIServer¶kube-apiserver是Kubernetes最重要的核心组件之一,主要提供以下的功能提供集群管理的RESTAPI接口,包括认证授权、数据校验以及集群状态变更等提......
  • APIO 2023 游记
    真心话大冒险很有趣。rand一个房间去敲门加QQ很有趣。这么看社恐猫好像也没那么社恐。面到了zplpcqieedx。单方面认识了很多神仙。比赛只会写暴力,评测queue害人不浅。最后97+60+8打铜了。顺路拜谢最佳女选手txx。>_<......
  • 两个视图基类GenericAPIView,APIView
    基于两个视图基类GenericAPIView,APIViewclassBookserializers(serializers.ModelSerializer):#name=serializers.CharField()#price=serializers.CharField()#publish_id=serializers.CharField(write_only=True)#Authors=serializers.ListFie......
  • 一个基础的vue图片放大镜自定义指令
    <template> <div>  <divv-magnifyref="content"class="content">   <imgsrc="https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg"alt="">  </div> </d......
  • 记Perfeye自定义项实现对比需求
    记Perfeye自定义项实现对比需求背景Perfyeye平台很早就支持对比功能了,但是支持的模块不全,需求方现在想要支持自定义列的需求对比功能,用来显示多份报告之间的差异以及性能趋势。刚接到这个需求的时候,我想,这不就是简简单单CV复制一下老代码的逻辑,改改相应字段就可以了,30分钟也......
  • 通过API接口调用数据的优势是什么?API接口调用展示示例
    ​通过API接口调用数据的优势主要有以下几点:1.规范化与一致性:API接口提供一种统一的方式来获取数据,保证了数据的规范化与一致性,消除了不同数据源可能带来的格式和结构上的差异。2.灵活性:使用API接口可以定制请求的参数和返回结果,让请求方可以得到所需的数据,而不必获取整个数......
  • Java调用采集拼多多根据ID获取商品详情API接口返回值说明示例,获取电商平台商品详情数
    ​     拼多多是一家基于C2B拼团营销方式主营团购的电商平台,其盈利模式由利润源、利润点、利润杠杆、利润通道和利润屏障五个要素组成的。通过锁定目标客户、关注客户价值、举办相关活动、不断拓展收入来源等经营策略,拼多多在较短的时间内得以快速成长。然而这种模式也......
  • API技巧集(一)
    一、拖动无标题窗体:包含头文件:#include$#@60;winuser.h$#@62;在窗体或组件的OnMouseDown事件中加入以下代码:if(Button==mbLeft){ReleaseCapture();SendMessage(Handle,WM_NCLBUTTONDOWN,HTCAPTION,0);}二、弹出和关闭光驱:包含头文件:#include$#@60;mmsystem.......
  • API技巧集(二)
    (一)不规则窗口Windows提供的只是标准的矩形窗口,要想建立一个不规则的窗口就需要调用API函数来实现。建立一个不规则的窗口,一般是先用创建区域的API函数建立一个不规则的区域,再用API函数SetWindowRgn改变窗口的区域。这些API函数在C++Builder中包含在头文件wingdi.h和winuser.......
  • 在Windows Server 2022中使用Microsoft Deployment Toolkit(MDT)时,可使用Rules(规则)文件
    在WindowsServer2022中使用MicrosoftDeploymentToolkit(MDT)时,可使用Rules(规则)文件来配置和自定义部署过程。以下是常见的Rules参数及其描述:UserDomain:指定要加入的域的名称。UserID和UserPassword:指定加入域所需的管理员帐户凭据。TimeZoneName:指定安装期间使用的时区。Jo......