美文网首页
springcloud(二)微服务接口规范

springcloud(二)微服务接口规范

作者: DimonHo | 来源:发表于2018-10-24 09:41 被阅读105次

微服务接口规范是指controller层的规范
controller的功能应该有以下五点:
1.参数校验
2.调用service层接口实现业务逻辑
3.转换业务/数据对象
4.组装返回对象
5.异常处理

  1. 定义状态码枚举类StatusEnum.java
package com.wd.cloud.commons.enums;

import org.springframework.lang.Nullable;

/**
 * @author He Zhigang
 * @date 2018/10/10
 * @Description:
 */
public enum StatusEnum {
    /**
     * 未知异常
     */
    UNKNOWN(-1, "unknow exception"),
    /**
     * 成功
     */
    SUCCESS(1, "successed"),
    /**
     * 失败
     */
    FAIL(0, "failed"),
    /**
     * HTTP状态码
     */
    CONTINUE(100, "Continue"),
    SWITCHING_PROTOCOLS(101, "Switching Protocols"),
    PROCESSING(102, "Processing"),
    CHECKPOINT(103, "Checkpoint"),
    OK(200, "OK"),
    CREATED(201, "Created"),
    ACCEPTED(202, "Accepted"),
    NON_AUTHORITATIVE_INFORMATION(203, "Non-Authoritative Information"),
    NO_CONTENT(204, "No Content"),
    RESET_CONTENT(205, "Reset Content"),
    PARTIAL_CONTENT(206, "Partial Content"),
    MULTI_STATUS(207, "Multi-Status"),
    ALREADY_REPORTED(208, "Already Reported"),
    IM_USED(226, "IM Used"),
    MULTIPLE_CHOICES(300, "Multiple Choices"),
    MOVED_PERMANENTLY(301, "Moved Permanently"),
    FOUND(302, "Found"),
    /**
     * @deprecated
     */
    @Deprecated
    MOVED_TEMPORARILY(302, "Moved Temporarily"),
    SEE_OTHER(303, "See Other"),
    NOT_MODIFIED(304, "Not Modified"),
    /**
     * @deprecated
     */
    @Deprecated
    USE_PROXY(305, "Use Proxy"),
    TEMPORARY_REDIRECT(307, "Temporary Redirect"),
    PERMANENT_REDIRECT(308, "Permanent Redirect"),
    BAD_REQUEST(400, "Bad Request"),
    UNAUTHORIZED(401, "Unauthorized"),
    PAYMENT_REQUIRED(402, "Payment Required"),
    FORBIDDEN(403, "Forbidden"),
    NOT_FOUND(404, "Not Found"),
    METHOD_NOT_ALLOWED(405, "Method Not Allowed"),
    NOT_ACCEPTABLE(406, "Not Acceptable"),
    PROXY_AUTHENTICATION_REQUIRED(407, "Proxy Authentication Required"),
    REQUEST_TIMEOUT(408, "Request Timeout"),
    CONFLICT(409, "Conflict"),
    GONE(410, "Gone"),
    LENGTH_REQUIRED(411, "Length Required"),
    PRECONDITION_FAILED(412, "Precondition Failed"),
    PAYLOAD_TOO_LARGE(413, "Payload Too Large"),
    /**
     * @deprecated
     */
    @Deprecated
    REQUEST_ENTITY_TOO_LARGE(413, "Request Entity Too Large"),
    URI_TOO_LONG(414, "URI Too Long"),
    /**
     * @deprecated
     */
    @Deprecated
    REQUEST_URI_TOO_LONG(414, "Request-URI Too Long"),
    UNSUPPORTED_MEDIA_TYPE(415, "Unsupported Media Type"),
    REQUESTED_RANGE_NOT_SATISFIABLE(416, "Requested range not satisfiable"),
    EXPECTATION_FAILED(417, "Expectation Failed"),
    I_AM_A_TEAPOT(418, "I'm a teapot"),
    /**
     * @deprecated
     */
    @Deprecated
    INSUFFICIENT_SPACE_ON_RESOURCE(419, "Insufficient Space On Resource"),
    /**
     * @deprecated
     */
    @Deprecated
    METHOD_FAILURE(420, "Method Failure"),
    /**
     * @deprecated
     */
    @Deprecated
    DESTINATION_LOCKED(421, "Destination Locked"),
    UNPROCESSABLE_ENTITY(422, "Unprocessable Entity"),
    LOCKED(423, "Locked"),
    FAILED_DEPENDENCY(424, "Failed Dependency"),
    UPGRADE_REQUIRED(426, "Upgrade Required"),
    PRECONDITION_REQUIRED(428, "Precondition Required"),
    TOO_MANY_REQUESTS(429, "Too Many Requests"),
    REQUEST_HEADER_FIELDS_TOO_LARGE(431, "Request Header Fields Too Large"),
    UNAVAILABLE_FOR_LEGAL_REASONS(451, "Unavailable For Legal Reasons"),
    INTERNAL_SERVER_ERROR(500, "Internal Server Error"),
    NOT_IMPLEMENTED(501, "Not Implemented"),
    BAD_GATEWAY(502, "Bad Gateway"),
    SERVICE_UNAVAILABLE(503, "Service Unavailable"),
    GATEWAY_TIMEOUT(504, "Gateway Timeout"),
    HTTP_VERSION_NOT_SUPPORTED(505, "HTTP Version not supported"),
    VARIANT_ALSO_NEGOTIATES(506, "Variant Also Negotiates"),
    INSUFFICIENT_STORAGE(507, "Insufficient Storage"),
    LOOP_DETECTED(508, "Loop Detected"),
    BANDWIDTH_LIMIT_EXCEEDED(509, "Bandwidth Limit Exceeded"),
    NOT_EXTENDED(510, "Not Extended"),
    NETWORK_AUTHENTICATION_REQUIRED(511, "Network Authentication Required"),
    /**
     * 数据库异常状态码
     */
    DB_EXCEPTION(1001, "数据库异常"),
    DB_PRIMARY_EXCEPTION(1002, "主键冲突"),
   
    private final int value;
    private final String message;

    private StatusEnum(int value, String message) {
        this.value = value;
        this.message = message;
    }

    public static StatusEnum valueOf(int statusCode) {
        StatusEnum status = resolve(statusCode);
        if (status == null) {
            throw new IllegalArgumentException("No matching constant for [" + statusCode + "]");
        } else {
            return status;
        }
    }

    @Nullable
    public static StatusEnum resolve(int statusCode) {
        StatusEnum[] statusEnums = values();
        for (StatusEnum statusEnum : statusEnums) {
            if (statusEnum.value == statusCode) {
                return statusEnum;
            }
        }
        return null;
    }

    public int value() {
        return value;
    }

    public String getMessage() {
        return message;
    }

    @Override
    public String toString() {
        return Integer.toString(this.value);
    }
}

  1. 定义API统一返回对象ResponseModel.java
package com.wd.cloud.commons.model;

import com.wd.cloud.commons.enums.StatusEnum;

import java.io.Serializable;

/**
 * @author He Zhigang
 * @date 2018/5/3
 * @remark api返回的response对象
 */
public class ResponseModel<T> implements Serializable {
    /**
     * 是否失败?error==true?失败:成功;
     */
    private boolean error;
    private Integer status;
    private String message;
    private T body;

    public ResponseModel(){}

    private ResponseModel(Throwable e) {
        this.error = true;
        this.message = e.toString();
        this.status = StatusEnum.FAIL.value();
    }

    private ResponseModel(StatusEnum statusEnum, boolean error) {
        this.error = error;
        this.status = statusEnum.value();
        this.message = statusEnum.getMessage();
    }

    public static ResponseModel ok() {
        return new ResponseModel(StatusEnum.SUCCESS, false);
    }

    public static ResponseModel ok(StatusEnum statusEnum) {
        return new ResponseModel(statusEnum, false);
    }

    /**
     * 请求失败,默认StatusEnum.FAIL
     *
     * @return
     */
    public static ResponseModel fail() {
        return new ResponseModel(StatusEnum.FAIL, true);
    }

    /**
     * 请求失败
     *
     * @param statusEnum
     * @return
     */
    public static ResponseModel fail(StatusEnum statusEnum) {
        return new ResponseModel(statusEnum, true);
    }

    public static ResponseModel fail(Throwable e) {
        return new ResponseModel(e);
    }

    public static ResponseModel serverError() {
        return new ResponseModel(StatusEnum.INTERNAL_SERVER_ERROR, true);
    }

    public Integer status() {
        return status;
    }

    public ResponseModel<T> status(Integer status) {
        this.status = status;
        return this;
    }

    public String message() {
        return message;
    }

    public ResponseModel<T> message(String message) {
        this.message = message;
        return this;
    }

    public T body() {
        return body;
    }

    public ResponseModel<T> body(T body) {
        this.body = body;
        return this;
    }

    public boolean isError() {
        return error;
    }

    public ResponseModel<T> setError(boolean error) {
        this.error = error;
        return this;
    }
}

相关文章

  • springcloud(二)微服务接口规范

    微服务接口规范是指controller层的规范controller的功能应该有以下五点:1.参数校验2.调用ser...

  • 【springcloud】简单创建一个springcloud项目

    简单的springcloud搭建 注册中心:eureka 接口服务:server web服务:web 网关:zuu...

  • 接口测试_动手

    一、需要的素材 接口规范 服务端源代码 客户端源代码 代码生成工具 二、环境搭建 接口规范浏览器打开地址,输入密码...

  • OpenFeign修改负载均衡策略

    前言 在SpringCloud中,Ribbon可以实现服务调用和负载均衡,而OpenFeign基于注解加接口的服务...

  • Spring Cloud 学习(6) ---Feign(一)

    在使用 SpringCloud 时,远程服务都是以 HTTP 接口形式对外提供服务,因此服务消费者在调用服务时,需...

  • 后端开发规范

    后端开发规范 SOA服务接口规范1、SOA接口命名提供出去后不能变更,废弃接口使用@deprecated进行标记2...

  • Hystrix总结

    SpringCloud 命中CAP理论中的AP,当调用某个服务接口时,Hystrix 会创建一个接口线程池来进行隔...

  • springcloud入门系列(3)- Zuul网关组件

    前面几篇关于springcloud的文章主要介绍了关于微服务的服务注册发现、接口请求,服务软负载,通过这几点已经可...

  • 9.feign远程调用问题

    springcloud项目中feign远程调用,标注@FeignClient的接口实例化失败。 服务提供方:ima...

  • test

    ## 微商城API文档 ### 1. 背景 本文旨在为实现微团手机客户端与服务端提供统一的接口调用与交互规范。 #...

网友评论

      本文标题:springcloud(二)微服务接口规范

      本文链接:https://www.haomeiwen.com/subject/wkbazftx.html