SpringBoot は、エレガントでグローバルに統合された Restful API 応答フレームワークを定義します

現在 Java プロジェクトがあり、上司からプロジェクト チームのリーダーになって、プロジェクトの基本フレームワークを定義し、システムの技術アーキテクチャを選択するように頼まれた場合、標準化され統一された Restful API 応答フレームワークをどのように設計すればよいでしょうか
?

考え

現在、プロジェクト開発はフロントエンドとバックエンドの分離モードに基づいていますが、バックエンドのテンプレート エンジンに基づいているため、一部のプロジェクト開発プロセスや現在の開発モデル、特に相対的に記述する場合には適用できない可能性があります。大規模プロジェクト、フロントエンド、バックエンドプロジェクトのポイント、チーム開発が必須

現在のフロントエンドおよびバックエンド開発のデータ送信形式のほとんどは json であるため、統一および標準化されたデータ形式を定義することは、フロントエンドとバックエンドの対話および UI 表示に役立ちます。

返される統合インターフェイス フォームには次の内容が含まれている必要があります。

  1. 応答が成功したかどうか
  2. 応答ステータスコード
  3. ステータスコードの説明
  4. 応答データ
  5. インターフェース呼び出し時間
  6. 他の識別子

これらに従って、統一された標準の結果の戻り値を定義できます。

応答列挙型

最初の 3 つは次のように定義できます。success,code,message

package cn.soboys.springbootrestfulapi.common.resp;

import lombok.Data;
import lombok.Getter;
import org.springframework.web.bind.annotation.GetMapping;

/**
 * @author 公众号 程序员三时
 * @version 1.0
 * @date 2023/4/28 22:39
 * @webSite https://github.com/coder-amiao
 * 响应结果枚举
 */
@Getter
public enum ResultCodeEnum{
    SUCCESS(true, 200, "成功"),
    FAIL(false, 400, "请求失败"),

    NOT_FOUND(false, 404, "接口不存在"),
    FORBIDDEN(false, 403, "资源拒绝访问"),
    UNAUTHORIZED(false, 401, "未认证(签名错误)"),

    INTERNAL_SERVER_ERROR(false, 500, "服务器内部错误"),


    NULL_POINT(false, 200002, "空指针异常"),
    PARAM_ERROR(false, 200001, "参数错误");

    /**
     * 响应是否成功
     */
    private Boolean success;
    /**
     * 响应状态码
     */
    private Integer code;
    /**
     * 响应信息
     */
    private String message;


    ResultCodeEnum(Boolean success, Integer code, String message) {
        this.success = success;
        this.code = code;
        this.message = message;
    }
}

統合された結果クラス

  • クラスuniformの呼び出し結果メソッドを外部に返すsuccess,failureため、コンストラクタはプライベートです。
  • 組み込みの静的メソッド、オブジェクトを直接返す
  • 統一した結果情報をカスタマイズしたり、チェーンプログラミングを利用したり、オブジェクトクラスそのものを返すと便利ですreturn this
  • 応答データは json 形式であり、JsonObject次のMap形式で定義できます。
package cn.soboys.springbootrestfulapi.common.resp;

import lombok.Data;

import java.util.HashMap;
import java.util.Map;

/**
 * @author 公众号 程序员三时
 * @version 1.0
 * @date 2023/4/28 22:47
 * @webSite https://github.com/coder-amiao
 * 统一响应结果处理  使用链式编程 返回类本身
 */
@Data
public class R {

    private Boolean success;

    private Integer code;

    private String message;

    /**
     * 接口请求时间戳
     */
    private Long timestamp;

    private Map<String, Object> data = new HashMap<>();


    private R setSuccess(Boolean success) {
        this.success = success;
        return this;
    }


    private R setMessage(String message) {
        this.message = message;
        return this;
    }

    private R setData(Map<String, Object> data) {
        this.data = data;
        return this;
    }

    private R setCode(Integer code) {
        this.code = code;
        return this;
    }

    private R() {
    }

    private R(Long timestamp) {
        this.timestamp = timestamp;
    }


    /**
     * 通用返回成功
     *
     * @return
     */
    public static R success() {
        return new R(System.currentTimeMillis())
                .setSuccess(ResultCodeEnum.SUCCESS.getSuccess())
                .setCode(ResultCodeEnum.SUCCESS.getCode())
                .setMessage(ResultCodeEnum.SUCCESS.getMessage());

    }

    /**
     * 通用返回失败
     *
     * @return
     */
    public static R failure() {
        return new R(System.currentTimeMillis())
                .setSuccess(ResultCodeEnum.FAIL.getSuccess())
                .setCode(ResultCodeEnum.FAIL.getCode())
                .setMessage(ResultCodeEnum.FAIL.getMessage());

    }

    /**
     * 设置结果,形参为结果枚举
     *
     * @param result
     * @return
     */
    public static R setResult(ResultCodeEnum result) {
        return new R(System.currentTimeMillis())
                .setSuccess(result.getSuccess())
                .setCode(result.getCode())
                .setMessage(result.getMessage());

    }


    // 自定义返回数据
    public R data(Map<String, Object> map) {
        return this.setData(map);

    }

    // 通用设置data
    public R data(String key, Object value) {
        this.data.put(key, value);
        return this;
    }

    // 自定义状态信息
    public R message(String message) {
        return this.setMessage(message);

    }

    // 自定义状态码
    public R code(Integer code) {
        return this.setCode(code);

    }

    // 自定义返回结果
    public R success(Boolean success) {
        return this.setSuccess(success);

    }

}

制御層の呼び出しが返されます。

package cn.soboys.springbootrestfulapi.controller;


import cn.soboys.springbootrestfulapi.common.resp.R;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

/**
 * @author 公众号 程序员三时
 * @version 1.0
 * @date 2023/4/28 23:58
 * @webSite https://github.com/coder-amiao
 */
@RestController
public class IndexController {

    @GetMapping("/index")
    public R index() {
        Map m = new HashMap();
        m.put("name", "Tom");
        m.put("age", 25);
        m.put("sex", "男");
        return R.success().data(m);
    }

    @GetMapping("/home")
    public R home() {

        Student s = new Student();
        s.setUserName("Tom");
        s.setBalance(2229891.0892);
        return R.success().data("user", s).message("查询用户详情信息");
    }

    /**
     * 异常返回模拟
     *
     * @return
     */
    @GetMapping("/exception")
    public R exception() {
        Map m = null;
        m.put("name", "Jack");
        return R.success().data("user", m).message("查询用户详情信息");
    }
}

統合された結果クラスの使用は、mybatis-plus の R オブジェクトの設計を参照します。

問題思考

統合された戻り結果を使用する場合、実行時例外によるプログラムの結果という別の状況が発生します。

それが事前に予測できるかどうか、そして返すRオブジェクトは正常に返されません。

今回の対処法

次の記事でも引き続き共有していきますので、ご意見を残してください

独自の開発足場テンプレートのセットを一から作成する準備をし、公開プログラマーに 3 時間注意を払う

おすすめ

転載: blog.csdn.net/u011738045/article/details/130465000