Skip to main content

REST API编码

REST层就是编写REST API接口给前端或第三方调用

1. 编写实现

因为项目使用的是Spring Boot,所以Rest按照Spring WebMVC的常规操作就可以了

这里给出一个示例


@Controller()
@RequestMapping(produces = MediaType.APPLICATION_JSON_VALUE,value = "/v1")
public class UserController {

@Inject
private IAuthentication authentication;

@Inject
private UserApplication userApplication;

@PostMapping("/users")
public ResponseEntity<UserVO> createLocalUser(@RequestBody UserVO userVO){
if(!authentication.isAuthentication()){
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
}
UserDto created = userApplication.createLocalUser(userVO.toDto());
return ResponseEntity.ok(UserVO.of(created));
}
}

Rest层中的代码,只能引用应用层定义接口,使用@Inject的方式进行注入就好

2. IAuthentication权限支撑接口

IAuthentication是对权限的一个抽象,在REST层中,可以通过注入此接口来获取当前登录用户的一些信息,比如是否传入access_token,以及其代表的登录帐号或第三方用户等


/**
* 授权的相关接口,供REST模块调用
*/
public interface IAuthentication {

/**
* 当前用户是否认证
* @return
*/
boolean isAuthentication();

/**
* 当前用户ID
* @return
*/
String currentUserId();

}

3. 编写单元测试

同样,你可以对你定义的controller进行单元测试,这里仅列出一个示例


class TestUserController extends AbstractControllerTest {

@Inject
private IAuthentication authentication;

@Test
void testCreateUser(){
Mockito.when(authentication.isAuthentication()).thenReturn(false);

ResponseEntity<UserVO> errorResponse = restTemplate.exchange(baseUrl()+"/v1/users", HttpMethod.POST,createHttpEntityFromString(randomUser()),UserVO.class);
Assertions.assertTrue(errorResponse.getStatusCode().is4xxClientError());

Mockito.when(authentication.isAuthentication()).thenReturn(true);
Mockito.when(authentication.currentUserId()).thenReturn("admin");

errorResponse = restTemplate.exchange(baseUrl()+"/v1/users", HttpMethod.POST,createHttpEntityFromString(noUserIdUser()),UserVO.class);
Assertions.assertTrue(errorResponse.getStatusCode().is4xxClientError());

UserVO created = createUser();
Assertions.assertNotNull(created);

}
}

AbstractControllerTest是一个支持Controller单元测试的抽象父类。

编写Controller的单元测试只需要继承它就可以后续只关注需要测试的一些功能点