一、 第一个接口
这个demo是后端程序,只需要给前端提供web 接口就可以。所有采用SpringMVC框架进行开发。
1. 接口返回类
package com.management.common.page;
import lombok.Data;
/**
* 通用接口返回类型
*
* @param <T> 返回结果类型
*/
@Data
public class ServiceApiResult<T> {
// 执行成功标志:默认成功
private Boolean success = true;
// 执行结果:建议使用 entity | map | list | string
private T data;
// 信息
private String message;
// code 1: 接口通, 0 :接口报错 -1 : 未登录
private int code;
public ServiceApiResult() {
}
public ServiceApiResult(int code, boolean success, String message, T data) {
this.code = code;
this.success = success;
this.message = message;
this.data = data;
}
/**
* 创建成功的返回结果
*
* @param <T> 返回结果类型
* @param data 返回结果类型
* @return 返回结果
*/
public static <T> ServiceApiResult<T> success(T data) {
try {
ServiceApiResult<T> result = new ServiceApiResult<T>(1, true, "", data);
return result;
} catch (Exception ex) {
return error(ex);
}
}
/**
* 创建成功的返回结果
*
* @param <T> 返回结果类型
* @param data 返回结果类型
* @return 返回结果
*/
public static <T> ServiceApiResult<T> success(String message, T data) {
try {
ServiceApiResult<T> result = new ServiceApiResult<T>(1, true, message, data);
return result;
} catch (Exception ex) {
return error(ex);
}
}
/**
* 创建失败的返回结果
*
* @param <T> 返回结果类型
* @return 返回结果
*/
public static <T> ServiceApiResult<T> fail(String message) {
try {
ServiceApiResult<T> result = new ServiceApiResult<T>(1, false, message, null);
return result;
} catch (Exception ex) {
return error(ex);
}
}
/**
* 创建失败的返回结果
*
* @param <T> 返回结果类型
* @return 返回结果
*/
public static <T> ServiceApiResult<T> fail(String message, T data) {
try {
ServiceApiResult<T> result = new ServiceApiResult<T>(1, false, message, data);
return result;
} catch (Exception ex) {
return error(ex);
}
}
/**
* 创建失败的返回结果
*
* @param <T> 返回结果类型
* @param ex 异常
* @return 返回结果
*/
public static <T> ServiceApiResult<T> error(Exception ex) {
String exceptionMessageFormat = "Message: %s, StackTrace: %s, Suppressed: %s, Cause: %s, Class: %s %s";
String msg = String.format(exceptionMessageFormat, ex.getMessage(), ex.getStackTrace(), ex.getSuppressed(),
ex.getCause(), ex.getClass(), System.getProperty("line.separator"));
return error(msg);
}
/**
* 创建失败的返回结果
*
* @param <T> 返回结果类型
* @param message 错误信息
* @return 返回结果
*/
public static <T> ServiceApiResult<T> error(String message) {
ServiceApiResult<T> result = new ServiceApiResult<T>(0, false, message, null);
return result;
}
}
2. dto
CreateOrganizationDto 作为接口参数
package com.management.dto.organization;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel("新建机构")
public class CreateOrganizationDto {
/**
* 上级部门Id
*/
@ApiModelProperty("父级机构id")
private String parentId;
/**
* 部门名称
*/
@ApiModelProperty("部门名称")
private String name;
}
3. 机构的controller
一个get请求的接口,一个post请求的接口。
package com.management.controller;
import com.management.common.page.ServiceApiResult;
import com.management.dto.organization.CreateOrganizationDto;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
/**
* (Organization)表控制层
*/
@Api(value = "机构相关接口")
@RestController
@Slf4j
@RequestMapping("organization")
public class OrganizationController {
@ApiOperation(value = "查询机构树,根据id")
@GetMapping("/queryOrgTree")
@ResponseBody
public ServiceApiResult<String> queryOrgTree(@RequestParam String id) {
try {
return ServiceApiResult.success("查询机构树,根据id");
} catch (Exception e) {
e.printStackTrace();
return ServiceApiResult.error(e.getMessage());
}
}
@ApiOperation(value = "创建机构信息")
@PostMapping("/createOrg")
@ResponseBody
public ServiceApiResult<String> createOrg(@RequestBody CreateOrganizationDto organization) {
try {
return ServiceApiResult.success("创建机构信息");
} catch (Exception e) {
e.printStackTrace();
return ServiceApiResult.error(e.getMessage());
}
}
}
4. swagger
到这里就可以运行了。但是为了方便调用,要配送一个接口管理工具swagger。
请求地址:http://localhost:8327/swagger-ui/index.html#/
package com.base.infrastructure.util.swagger;
import io.swagger.annotations.ApiOperation;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.*;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.service.contexts.SecurityContext;
import springfox.documentation.spring.web.plugins.Docket;
import java.util.ArrayList;
import java.util.List;
/**
* http://localhost:8083/swagger-ui/index.html#/
*/
@Configuration
public class SwaggerConfiguration {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.OAS_30)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
.paths(PathSelectors.any())
.build()
.securitySchemes(securityScheme2())
.securityContexts(securityContext2());
}
private List<SecurityScheme> securityScheme2( ) {
List<SecurityScheme> schemes = new ArrayList<>();
// 全局Token
ApiKey token = new ApiKey("token", "token","header");
ApiKey menuId = new ApiKey("menuId", "menuId","header");
schemes.add(token);
schemes.add(menuId);
return schemes;
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("Swagger3接口文档")
.description("base service documents")
.version("1.0")
.build();
}
List<SecurityReference> defaultAuth() {
AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
authorizationScopes[0] = authorizationScope;
List<SecurityReference> securityReferences = new ArrayList<>();
//验证增加(有许多教程说明中这个地方是Authorization,导致不能带入全局token,因为securitySchemes()方法中header写入token,所以这个地方我改为token就可以了)
securityReferences.add(new SecurityReference("token", authorizationScopes));
return securityReferences;
}
private List<SecurityContext> securityContext2() {
List<SecurityContext> contexts = new ArrayList<>();
SecurityContext context2 = SecurityContext.builder()
.securityReferences(defaultAuth())
.forPaths(PathSelectors.any())
.build();
contexts.add(context2);
return contexts;
}
}