当前位置: 首页 > news >正文

大良营销网站建设案例一个新品牌如何推广

大良营销网站建设案例,一个新品牌如何推广,江西省城乡和住房建设厅网站,做网站注册商标go-zero 错误处理(统一响应信息) 在实现注册逻辑时,尝试重复注册可能会返回 400 状态码,显然不符合正常设计思维。我们希望状态码为 200,并在响应中返回错误信息。 一、使用第三方库 1.下载库 目前 go-zero官方的…

go-zero 错误处理(统一响应信息)

在实现注册逻辑时,尝试重复注册可能会返回 400 状态码,显然不符合正常设计思维。我们希望状态码为 200,并在响应中返回错误信息。
在这里插入图片描述

一、使用第三方库

1.下载库

目前 go-zero官方的 zeromicro 下有一个 x 仓库,可以实现统一响应格式,我们先安装下:

go get github.com/zeromicro/x

它会自动帮我们把响应信息改为下面这种格式:

{"code": 0,"msg": "ok","data": {...}
}

2.修改handler

接着我们修改internal/handler/register/registerhandler.go文件,把原来的响应处理,替换成这个库的:

//导入zeromicro库并设置别名,避免和原生的http冲突
import (xhttp "github.com/zeromicro/x/http"  
)//修改RegisterHandler的返回信息
func RegisterHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {return func(w http.ResponseWriter, r *http.Request) {var req types.RegisterRequestif err := httpx.Parse(r, &req); err != nil {//使用xhttp.JsonBaseResponseCtx 替换掉httpx.ErrorCtxxhttp.JsonBaseResponseCtx(r.Context(), w, err)//httpx.ErrorCtx(r.Context(), w, err)return}l := register.NewRegisterLogic(r.Context(), svcCtx)resp, err := l.Register(&req)if err != nil {//使用xhttp.JsonBaseResponseCtx 替换掉httpx.ErrorCtxxhttp.JsonBaseResponseCtx(r.Context(), w, err)//httpx.ErrorCtx(r.Context(), w, err)} else {//使用xhttp.JsonBaseResponseCtx 替换掉httpx.OkJsonCtxxhttp.JsonBaseResponseCtx(r.Context(), w, resp)//httpx.OkJsonCtx(r.Context(), w, resp)}}
}

3.修改返回错误

internal/logic/user/registerlogic.go 文件中,把原来的err 修改成 errors.New() ,它的参数有两个,一个是用来返回 code码 ,还有一个是message消息:

func (l *RegisterLogic) Register(req *types.RegisterRequest) (resp *types.RegisterResponse, err error) {// todo: add your logic here and delete this line/*.....*/if user != nil {//return nil, errreturn nil, errors.New(1, "用户已注册")}//插入新的数据/*.....*/if err != nil {//return nil, errreturn nil, errors.New(2, "用户注册失败")}}

接着我们运行项目,使用Postman重新测试,结果如下:
在这里插入图片描述

二、自定义错误管理

如果你不想使用这个库,或者想自己实现一些自定义错误,那么你也可以自己设置错误管理

1.自定义错误结构与格式化

我们在internal目录下新建biz目录,用于业务处理,然后再这个目录下分别创建3个文件

创建biz.go 文件

package biztype Error struct {Code int    `json:"code"`Msg  string `json:"msg"`
}func NewError(code int, msg string) *Error {return &Error{Code: code,Msg:  msg,}
}func (e *Error) Error() string {return e.Msg
}

创建resp.go 文件

package biztype Result struct {Code int    `json:"code"`Msg  string `json:"msg"`Data any    `json:"data"`
}func Success(data any) *Result {return &Result{Code: Ok,Msg:  "success",Data: data,}
}func Fail(err *Error) *Result {return &Result{Code: err.Code,Msg:  err.Msg,}
}

创建vars.go 文件

package bizconst Ok = 200var (AlreadyRegister = NewError(1, "用户已注册")PasswordErr     = NewError(2, "密码错误")InsertErr       = NewError(3, "用户注册失败")
)

2. 使用 httpx.Error 和 httpx.SetErrorHandler

接着修改user.go 文件:

	/*....*/defer server.Stop()//httpx.SetErrorHandler 函数可以帮助你定义一个全局的错误处理逻辑,//该逻辑会在 HTTP handler 中捕获到的所有错误中执行。//它将允许你统一处理各类错误,返回更加一致和用户友好的响应。//httpx.SetErrorHandler 仅在调用了 httpx.Error 处理响应时才有效。httpx.SetErrorHandler(func(err error) (int, any) {switch e := err.(type) {case *biz.Error:// 自定义一个 错误返回类型return http.StatusOK, biz.Fail(e)default:return http.StatusInternalServerError, nil}})ctx := svc.NewServiceContext(c)/*....*/

修改internal/handler/register/registerhandler.go文件:

func RegisterHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {return func(w http.ResponseWriter, r *http.Request) {var req types.RegisterRequestif err := httpx.Parse(r, &req); err != nil {//httpx.SetErrorHandler 仅在调用了 httpx.Error 处理响应时才有效。//所以我们现在还是使用原来的httpx.ErrorCtxhttpx.ErrorCtx(r.Context(), w, err)return}l := register.NewRegisterLogic(r.Context(), svcCtx)resp, err := l.Register(&req)if err != nil {//httpx.SetErrorHandler 仅在调用了 httpx.Error 处理响应时才有效。//所以我们现在还是使用原来的httpx.ErrorCtxhttpx.ErrorCtx(r.Context(), w, err)} else {//成功的请求,httpx.SetErrorHandler 是捕获不到的// 所以需要我们自定义返回信息httpx.OkJsonCtx(r.Context(), w, biz.Success(resp))}}
}

3.实现统一的错误响应机制

接下来,修改 internal/user/register/registerlogic.go文件:

func (l *RegisterLogic) Register(req *types.RegisterRequest) (resp *types.RegisterResponse, err error) {// todo: add your logic here and delete this line/*...*/if user != nil {//return nil, errors.New(1, "用户已注册")return nil, biz.AlreadyRegister}//插入新的数据/*...*/if err != nil {//return nil, errors.New(2, "用户注册失败")return nil, biz.InsertErr}}

接着运行测试
在这里插入图片描述

http://www.dinnco.com/news/17319.html

相关文章:

  • 有什么关于网站建设实例的书app拉新推广平台渠道商
  • 源码网站开发制作网页代码大全
  • 嘉定网站设计制作公司网站代运营价格
  • 山西网站开发二次开发百度账号客服人工电话
  • 企业网站建设方案东莞建设网
  • 怎样做淘宝网站建设百度快照推广有效果吗
  • 凡科网站建设如何植入代码武汉网站seo推广
  • 美国网站后缀营业推广方案怎么写
  • wordpress弹窗登录插件福州搜索引擎优化公司
  • 自己做企业网站服务器旅游产品推广有哪些渠道
  • 加强政府网站建设管理讲话浏览器下载安装2023版本
  • 陌上香坊是做盗版的网站吗国内5大搜索引擎
  • 中国江西网官方网站淘宝指数
  • 工业贸易企业 营销型网站如何联系百度人工客服
  • 银行网站建设方案百度网站排名怎么提高
  • 网站网页设计html高端企业网站模板
  • 烟台网站建设服务在线排名优化工具
  • 网站栏目页如何做山东seo优化
  • 重庆网站建设公司的网站短期培训学什么好
  • 免费图标下载网站排名前十的大学
  • 网站建设教学方法探究广州各区正在进一步优化以下措施
  • 有哪些网站用vue做的如何查看网站收录情况
  • 自己怎么做网站推广创建属于自己的网站
  • 网站头部seo范例google关键词排名查询
  • 门户网站开发的意义网站的优化从哪里进行
  • 网站搜索模块cms
  • 做网站留后门是怎么回事今日刚刚发生的重大新闻
  • 京东网站建设百度店铺免费入驻
  • 网站内页怎样做优化企业策划咨询公司
  • 域名备案成功如何做网站长春网站建设路