Golang钩子

本文将重点介绍,飞布内置的Go 钩子如何使用。

开发钩子的过程和开发Go 服务是一样的,你都需要准备开发环境。

快速操作

钩子编写

IDE编写

由于钩子服务本身是一个完整可启动的项目,因此在通过上一节创建钩子后,可以直接在本地找到 custom-go 文件夹,使用任意 IDE 或编辑器打开钩子项目进行编辑。

钩子调试

钩子服务本地启动,可以配置钩子服务器地址,默认是localhost:9992,如果将钩子服务移动到其他地址,可以在钩子面板中修改。

IDE 调试

在 IDE 中打开custom-go文件夹执行以下脚本启动钩子服务器。也可以通过调试器启动,以实现断点调试功能。

go mod tidy
go run main.go

函数签名

所以钩子函数入参一个是hook对象,包含以下参数中的全部或一部分。

  • clientRequest: 客户端请求对象,包含请求头、请求体、请求参数等信息

  • internalClient: 内部客户端,可以通过此客户端发起内部请求,或操作数据库等

  • user: 用户信息

  • logger: 日志对象

另一个是body对象,包含以下参数中的全部或一部分。

  • input: 输入参数

  • response: 响应对象

postAuthentication

用户身份验证后,会调用此函数,可以在此函数中进行用户信息存储或打印日志等操作。

函数签名

func PostAuthentication(hook *base.AuthenticationHookRequest) error

mutatingPostAuthentication

用户身份验证后,会调用此函数,可以在此函数中手动控制用户身份验证结果,返回 ok 表示验证通过,deny 表示验证失败。 验证通过时,可以修改返回的user对象,如果不需要修改,则直接返回入参的user即可。

函数签名

func MutatingPostAuthentication(hook *base.AuthenticationHookRequest) (*plugins.AuthenticationResponse, error)

revalidate

重新验证用户身份,当用户身份信息或权限等变更时,可以触发此钩子,用于更新相关数据。返回内容同 mutatingPostAuthentication

函数签名

func Revalidate(hook *base.AuthenticationHookRequest) (*plugins.AuthenticationResponse, error)

postLogout

用户登出时触发,可以在此钩子中清理用户登录信息,如删除外部session等。

函数签名

func PostLogout(hook *base.AuthenticationHookRequest) error

beforeRequest

请求尚未触发时,可以在此钩子中对请求进行预处理,如修改请求头、请求体等。返回值为修改后的请求对象。

函数签名

func BeforeOriginRequest(hook *base.HttpTransportHookRequest, body *plugins.HttpTransportBody) (*base.ClientRequest, error)

onRequest

请求到达时触发,可以在此钩子中对请求进行预处理,如修改请求头、请求体等。返回值为修改后的请求对象。

函数签名

func OnOriginRequest(hook *base.HttpTransportHookRequest, body *plugins.HttpTransportBody) (*base.ClientRequest, error)

onResponse

请求完成触发后,可以在此钩子中对响应进行预处理,如修改响应头、响应体等。返回值为修改后的响应对象。

函数签名

func OnOriginResponse(hook *base.HttpTransportHookRequest, body *plugins.HttpTransportBody) (*base.ClientResponse, error) 

preResolve

该钩子在请求到达后,api执行前触发,此处不能修改请求信息,通常可以在此处做日志记录。

函数签名

func PreResolve(hook *base.HookRequest, body generated.$HOOK_NAME$Body) (res generated.$HOOK_NAME$Body, err error)

mutatingPreResolve

该钩子在请求到达后,api执行前触发,该接口可以修改请求入参。

函数签名

func MutatingPreResolve(hook *base.HookRequest, body generated.$HOOK_NAME$Body) (res generated.$HOOK_NAME$Body, err error)

postResolve

该钩子在api执行后触发,此处不能修改请求信息,通常可以在此处做日志记录,或触发其他额外操作。

函数签名

func PostResolve(hook *base.HookRequest, body generated.$HOOK_NAME$Body) (res generated.$HOOK_NAME$Body, err error)

mutatingPostResolve

该钩子在api执行后触发,该接口可以修改响应内容。

函数签名

func MutatingPostResolve(hook *base.HookRequest, body generated.$HOOK_NAME$Body) (res generated.$HOOK_NAME$Body, err error)

customResolve

该钩子在api执行前触发,你可以在该接口中覆盖 api 的执行逻辑。当该接口返回 void 或 null 时,将正常执行api,否则将跳过执行直接返回该接口的返回值。 您可以在该接口中实现自定义权限或其他数据校验逻辑,用以控制api的执行。

函数签名

func CustomResolve(hook *base.HookRequest, body generated.$HOOK_NAME$Body) (res generated.$HOOK_NAME$Body, err error)

mockResolve

该钩子用于实现mock功能, 用于在开发阶段模拟api的返回结果,以便于前端开发人员进行开发。

函数签名

func MockResolve(hook *base.HookRequest, body generated.$HOOK_NAME$Body) (res generated.$HOOK_NAME$Body, err error)

参考仓库

golang 钩子示例:https://github.com/fireboomio/simple-firetalk (包含了所有常见钩子的使用示例。)

最后更新于