golang遵循JsonApi规范的JSON错误响应生成插件go-jsonerror的使用

Golang 遵循 JsonApi 规范的 JSON 错误响应生成插件 go-jsonerror 的使用

简介

Go-JsonError 是一个用于生成遵循 JsonApi 规范的 JSON 错误响应的 Golang 插件。它可以帮助开发者轻松创建符合 JsonApi 规范的错误响应。

安装

go get github.com/ddymko/go-jsonerror

使用示例

基本用法

要使用 jsonError,你需要初始化 ErrorJson 结构体。当你想添加错误时,必须将一个 ErrorComp 结构体传递给 AddError() 方法。

package main

import (
	"fmt"
	"github.com/ddymko/go-jsonerror"
)

func main() {
	// 初始化错误对象
	var err gojsonerror.ErrorJSON

	// 创建错误详情
	errorComposition := gojsonerror.ErrorComp{
		Detail: "this is a error message",  // 错误详情
		Code:   "This is the code",         // 错误代码
		Source: gojsonerror.Source{
			Pointer: "/unit/tests",        // 错误来源指针
		},
		Title:  "Title Test",              // 错误标题
		Status: 200,                       // HTTP 状态码
	}

	// 添加错误到错误对象
	err.AddError(errorComposition)

	// 获取错误JSON字符串
	fmt.Println(err.Error())
	
	// 获取错误JSON字节数组
	fmt.Println(err.ErrorByte())
}

输出示例

上面的代码会生成如下 JSON 格式的错误响应:

{
  "errors": [
    {
      "detail": "this is a error message",
      "code": "This is the code",
      "source": {
        "pointer": "/unit/tests"
      },
      "title": "Title Test",
      "status": 200
    }
  ]
}

错误结构体说明

ErrorComp 结构体包含以下字段:

  • Detail: 错误详情描述
  • Code: 错误代码
  • Source: 错误来源,包含 Pointer 字段指向错误位置
  • Title: 错误标题
  • Status: HTTP 状态码

测试

该包使用 Go 标准测试包,你可以运行以下命令执行测试:

go test ./...

贡献

欢迎提交 Pull Request 来改进这个项目。

许可证

该项目使用 MIT 许可证。


更多关于golang遵循JsonApi规范的JSON错误响应生成插件go-jsonerror的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang遵循JsonApi规范的JSON错误响应生成插件go-jsonerror的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用go-jsonerror生成遵循JsonApi规范的错误响应

go-jsonerror是一个用于生成符合JsonApi规范错误响应的Go语言库。JsonApi规范为错误响应定义了统一的结构,使得API客户端能够以标准化的方式处理错误。

安装

go get github.com/deliveroo/go-jsonerror

基本用法

创建简单错误

package main

import (
	"encoding/json"
	"fmt"
	"net/http"
	
	"github.com/deliveroo/go-jsonerror"
)

func main() {
	// 创建一个简单的错误
	err := jsonerror.New(
		http.StatusBadRequest,
		"invalid_parameter",
		"The 'email' parameter is invalid",
	)
	
	// 转换为JSON
	jsonData, _ := json.MarshalIndent(err, "", "  ")
	fmt.Println(string(jsonData))
}

输出:

{
  "errors": [
    {
      "status": "400",
      "code": "invalid_parameter",
      "title": "Bad Request",
      "detail": "The 'email' parameter is invalid"
    }
  ]
}

添加更多错误详情

err := jsonerror.New(
	http.StatusNotFound,
	"resource_not_found",
	"User with ID 123 not found",
).WithMeta(map[string]interface{}{
	"resource_id": "123",
	"resource_type": "user",
}).WithSource(&jsonerror.ErrorSource{
	Parameter: "id",
})

输出:

{
  "errors": [
    {
      "status": "404",
      "code": "resource_not_found",
      "title": "Not Found",
      "detail": "User with ID 123 not found",
      "source": {
        "parameter": "id"
      },
      "meta": {
        "resource_id": "123",
        "resource_type": "user"
      }
    }
  ]
}

在HTTP处理器中使用

func getUserHandler(w http.ResponseWriter, r *http.Request) {
	userID := r.URL.Query().Get("id")
	if userID == "" {
		err := jsonerror.New(
			http.StatusBadRequest,
			"missing_parameter",
			"The 'id' parameter is required",
		).WithSource(&jsonerror.ErrorSource{
			Parameter: "id",
		})
		
		w.Header().Set("Content-Type", "application/json")
		w.WriteHeader(err.Status)
		json.NewEncoder(w).Encode(err)
		return
	}
	
	// 正常处理逻辑...
}

创建多个错误的响应

errors := jsonerror.Errors{
	jsonerror.New(
		http.StatusBadRequest,
		"invalid_email",
		"The email format is invalid",
	).WithSource(&jsonerror.ErrorSource{
		Parameter: "email",
	}),
	jsonerror.New(
		http.StatusBadRequest,
		"invalid_password",
		"Password must be at least 8 characters",
	).WithSource(&jsonerror.ErrorSource{
		Parameter: "password",
	}),
}

w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusBadRequest)
json.NewEncoder(w).Encode(errors)

输出:

{
  "errors": [
    {
      "status": "400",
      "code": "invalid_email",
      "title": "Bad Request",
      "detail": "The email format is invalid",
      "source": {
        "parameter": "email"
      }
    },
    {
      "status": "400",
      "code": "invalid_password",
      "title": "Bad Request",
      "detail": "Password must be at least 8 characters",
      "source": {
        "parameter": "password"
      }
    }
  ]
}

自定义错误

你还可以创建自定义的错误类型:

type CustomError struct {
	*jsonerror.Error
	CustomField string `json:"custom_field"`
}

func NewCustomError(status int, code, detail, customField string) *CustomError {
	return &CustomError{
		Error:       jsonerror.New(status, code, detail),
		CustomField: customField,
	}
}

// 使用
err := NewCustomError(
	http.StatusForbidden,
	"access_denied",
	"You don't have permission to access this resource",
	"additional_info",
)

jsonData, _ := json.MarshalIndent(err, "", "  ")
fmt.Println(string(jsonData))

输出:

{
  "errors": [
    {
      "status": "403",
      "code": "access_denied",
      "title": "Forbidden",
      "detail": "You don't have permission to access this resource",
      "custom_field": "additional_info"
    }
  ]
}

总结

go-jsonerror库提供了简单易用的方式来生成符合JsonApi规范的错误响应,主要特点包括:

  1. 遵循JsonApi错误响应规范
  2. 支持添加元数据(meta)和错误源(source)
  3. 支持多个错误组合
  4. 易于扩展自定义错误类型
  5. 与标准net/http包无缝集成

通过使用这个库,你可以确保你的API错误响应保持一致性,客户端可以更容易地解析和处理错误。

回到顶部