0%

springboot中接口统一返回协议体定义

在日常接口开发中,通常涉及到与不同的终端进行交互,此时需要设计一个合适的接口协议体,以方便统一交互。接下来以在springboot中应用为例,来给出协议体定义案例。

返回协议体定义

这里给出的接口统一返回协议体涉及实体和MAP两种形式,下面直接贴上协议体的代码。

实体response

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package com.lazycece.sbac.response.response;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
* define the common response body
*
* @author lazycece
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ResponseData<T> {

/**
* the response code
*/
private Integer status;
/**
* the response message
*/
private String message;
/**
* the response body
*/
private T body;

/**
* define success response data by default code and message, but no body
*
* @return response
*/
public static ResponseData success() {
return new ResponseData<>(ResponseCode.SUCCESS, ResponseMsg.SUCCESS, null);
}

/**
* define success response data by default code and message, the body is flexible
*
* @param body body
* @param <T> T
* @return response
*/
public static <T> ResponseData<T> success(T body) {
return new ResponseData<>(ResponseCode.SUCCESS, ResponseMsg.SUCCESS, body);
}

/**
* define the fail response by default code and message
*
* @return response
*/
public static ResponseData fail() {
return new ResponseData<>(ResponseCode.FAIL, ResponseMsg.FAIL, null);
}

/**
* define the fail response by default code, and the message is flexible
*
* @param message fail message
* @return response
*/
public static ResponseData fail(String message) {
return new ResponseData<>(ResponseCode.FAIL, message, null);
}

/**
* define the fail response, the code and message both flexible
*
* @param status code
* @param message message
* @return response
*/
public static ResponseData fail(Integer status, String message) {
return new ResponseData<>(status, message, null);
}
}

MAP形式response

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
package com.lazycece.sbac.response.response;

import java.util.HashMap;

/**
* @author lazycece
*/
public class ResponseMap extends HashMap<String, Object> {

private ResponseMap(Integer status, String message) {
this.put("status", status);
this.put("message", message);
}

/**
* define success response map on default code and message
*
* @return this
*/
public static ResponseMap success() {
return new ResponseMap(ResponseCode.SUCCESS, ResponseMsg.SUCCESS);
}

/**
* define fail response map on default code and message
*
* @return this
*/
public static ResponseMap fail() {
return new ResponseMap(ResponseCode.FAIL, ResponseMsg.FAIL);
}

/**
* define fail response map on default code
*
* @param message ""
* @return this
*/
public static ResponseMap fail(String message) {
return new ResponseMap(ResponseCode.FAIL, message);
}

/**
* define fail response map
*
* @param status ""
* @param message ""
* @return this
*/
public static ResponseMap fail(Integer status, String message) {
return new ResponseMap(status, message);
}

/**
* @param key key
* @param value value
* @return this
*/
public ResponseMap putting(String key, Object value) {
this.put(key, value);
return this;
}
}

message和code

1
2
3
4
5
6
7
8
9
10
11
public interface ResponseMsg {

String SUCCESS = "success";
String FAIL = "fail";
}

public interface ResponseCode {

Integer SUCCESS = 200;
Integer FAIL = 800;
}

使用案例

这里给出一个简单的使用案例:接口中直接返回一个用户实体。分别以两种返回协议体进行展现,这里只使用一个success方法。

下面直接贴上代码:

controller

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package com.lazycece.sbac.response.controller;

import com.lazycece.sbac.response.entity.User;
import com.lazycece.sbac.response.response.ResponseData;
import com.lazycece.sbac.response.response.ResponseMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
* @author lazycece
* @date 2019/02/22
*/
@RestController
@RequestMapping("/response")
public class ResponseController {

@GetMapping("/data/user/info")
public ResponseData getDataJson() {
return ResponseData.success(getUserInfo());
}

@GetMapping("/map/user/info")
public ResponseMap getMapJson() {
return ResponseMap.success().putting("data", getUserInfo());
}

private User getUserInfo() {
User user = new User();
user.setId("sfjsoop1jsjisf_1");
user.setUsername("lazycece");
user.setName("W");
user.setAge(200);
return user;
}
}

entity

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package com.lazycece.sbac.response.entity;

import lombok.Data;

import java.util.Date;

/**
* @author lazycece
* @date 2019/02/22
*/
@Data
public class User {

private String id;
private String username;
private String name;
private Integer age;
private Date createTime = new Date();
private Date updateTime = new Date();
}

Junit test

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
package com.lazycece.sbac.response;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;

import javax.annotation.Resource;

/**
* @author lazycece
* @date 2019/02/22
*/
@RunWith(SpringRunner.class)
@WebMvcTest
public class ResponseControllerTest {

@Resource
private MockMvc mockMvc;

@Test
public void testGetDataJson() throws Exception {
MvcResult response = this.mockMvc
.perform(MockMvcRequestBuilders.get("/response/data/user/info"))
.andExpect(MockMvcResultMatchers.status().isOk())
.andReturn();
System.out.println(response.getResponse().getContentAsString());
}

@Test
public void testGetMapJson() throws Exception {
MvcResult response = this.mockMvc
.perform(MockMvcRequestBuilders.get("/response/map/user/info"))
.andExpect(MockMvcResultMatchers.status().isOk())
.andReturn();
System.out.println(response.getResponse().getContentAsString());
}
}

请求返回结果如下:

1
{"data":{"id":"sfjsoop1jsjisf_1","username":"lazycece","name":"W","age":200,"createTime":"2019-02-22T13:12:45.877+0000","updateTime":"2019-02-22T13:12:45.877+0000"},"message":"success","status":200}

案例源码

案例源码地址:https://github.com/lazycece/springboot-actual-combat/tree/master/springboot-ac-response