REST API返回结果对象设计

简介: REST API返回结果对象设计

基于REST API的项目返回的数据结构题都是统一的,这样方便接口对接和使用。因此,对结果对象的设计会有一定的要求:


一个结果对象要能够同时支持成功和失败的数据结构;

要能够处理多种类的返回结果对象;

能够很轻易的判断出结果是成功还是失败;

能够存储错误编码和错误信息;

下面就基于Spring Boot项目来设计一下对应的统一结果返回对象。这里定义对应的类为ApiResponse:


import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonValue;
public final class ApiResponse<T> {
    private ErrorResponse error;
    private T data;
    private Status status;
    private ApiResponse(Status status, ErrorResponse error) {
        this.error = error;
        this.status = status;
    }
    private ApiResponse(Status status, T data) {
        this.data = data;
        this.status = status;
    }
    @JsonCreator
    public static <T> ApiResponse<T> success(
            @JsonProperty("status") Status status,
            @JsonProperty("data") T data) {
        return new ApiResponse<>(status, data);
    }
    @JsonCreator
    public static <T> ApiResponse<T> error(
            @JsonProperty("status") Status status,
            @JsonProperty("error") ErrorResponse error) {
        return new ApiResponse<>(status, error);
    }
    public enum Status {
        SUCCESS("success"), ERROR("error");
        private final String status;
        Status(String status) {
            this.status = status;
        }
        @JsonValue
        public String getStatus() {
            return this.status;
        }
    }
    public ErrorResponse getError() {
        return this.error;
    }
    public T getData() {
        return this.data;
    }
    public Status getStatus() {
        return this.status;
    }
}

上面的类有以下关键点:

  • Status枚举类用来保存状态,这样可以方便的看出请求是成功还是失败;
  • data变量使用了泛型,可以存储任何类型的对象;
  • 错误信息可以通过error属性来获得;

ErrorResponse类内容如下:

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
public final class ErrorResponse {
    public final String code;
    public final String message;
    @JsonCreator
    public ErrorResponse(
            @JsonProperty("code") String code,
            @JsonProperty("message") String message) {
        this.code = code;
        this.message = message;
    }
}

ErrorResponse有code和message两个字段,code可以是http的返回编码也可以是任何业务编码。message变量用描述错误的信息。

基于上述对象,返回的JSON报文格式如下:

{
    "status": "success",
    "data": {
        "task": "Write a post",
        "taskStatus":"in_progress",
        "tags":["writing"]
    }
}

错误的报文如下:

{
    "status": "error",
    "error": {
        "code" "409",
         "message" : "User with username xyz already exists"
    }
}

需要注意的是JSON序列化时,需要排除结果为null的值。比如,在发生错误时,可能不希望data为null,如果使用的是Spring Boot框架,可以通过如下方式进行配置:


spring.jackson.default-property-inclusion=NON_NULL

1

如果使用的是Java 8或Gauva,想要要排除可选类型,则应使用NON_ABSENT值。


spring.jackson.default-property-inclusion=NON_ABSENT

1



目录
相关文章
|
2月前
|
JSON API 开发工具
【Azure 应用服务】调用Azure REST API来获取 App Service的访问限制信息(Access Restrictions)以及修改
【Azure 应用服务】调用Azure REST API来获取 App Service的访问限制信息(Access Restrictions)以及修改
|
2月前
|
存储 API 网络架构
【Azure 存储服务】调用REST API获取Stroage Account Table中所有的Entity计数 -- Count
【Azure 存储服务】调用REST API获取Stroage Account Table中所有的Entity计数 -- Count
|
9天前
|
JSON 中间件 API
开发REST API3-11
开发REST API3-11
|
10天前
|
JSON JavaScript API
编写REST API
编写REST API
22 2
|
1月前
|
JavaScript 前端开发 API
什么是ES6的Proxy对象和Reactive API
【9月更文挑战第3天】什么是ES6的Proxy对象和Reactive API
18 8
|
2月前
|
存储 JSON API
【Azure 存储服务】使用REST API操作Azure Storage Table,删除数据(Delete Entity)
【Azure 存储服务】使用REST API操作Azure Storage Table,删除数据(Delete Entity)
【Azure 存储服务】使用REST API操作Azure Storage Table,删除数据(Delete Entity)
|
2月前
|
XML 安全 API
REST 和 SOAP API 有什么区别?
【8月更文挑战第31天】
33 0
|
2月前
|
JSON API 数据安全/隐私保护
哇塞!Django REST framework 太逆天啦!构建 API 服务从未如此轻松,你还不来试试?
【8月更文挑战第31天】Django REST framework(DRF)是基于Django框架的高效Web API开发工具,提供序列化、视图集、路由等功能,简化API构建流程。使用DRF可轻松实现数据的序列化与反序列化,并支持权限管理和认证机制以保障API安全。安装DRF只需通过`pip install djangorestframework`命令。要创建基本项目,先安装Django并创建新应用,定义模型、序列化器及视图集,最后配置路由。测试API时,可通过Postman发送HTTP请求验证功能。无论项目大小,DRF均能提供强大支持。
26 0
|
2月前
|
中间件 API 网络架构
Django后端架构开发:从匿名用户API节流到REST自定义认证
Django后端架构开发:从匿名用户API节流到REST自定义认证
18 0
|
2月前
|
API 网络架构 C++
【Azure Key Vault】使用REST API调用Azure Key Vault Secret的示例步骤
【Azure Key Vault】使用REST API调用Azure Key Vault Secret的示例步骤