SpringBoot RESTFUL 實現
RESTFUL是一種網絡應用程序的設計風格和開發方式,基於HTTP,可以使用XML格式定義或JSON格式定義。RESTFUL適用於移動互聯網廠商作爲業務使能接口的場景,實現第三方OTT調用移動網絡資源的功能,動作類型爲新增、變更、刪除所調用資源 ——來自百度百科
注意事項
1.maven 依賴
<!-- springCloud 主要用於jar包的版本控制 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${commons-lang3.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-commons</artifactId>
<version>${data-commons.version}</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>${commons-io.version}</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>${commons-lang.version}</version>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>${commons-collections.version}</version>
</dependency>
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>${commons-beanutils.version}</version>
</dependency>
<!-- RESTful APIs swagger2 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger.version}</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>${hutool.version}</version>
</dependency>
2.分組校驗
實體類定義如下:
public class User implements Serializable {
private static final long serialVersionUID = 1838417777538323571L;
//主鍵
@NotNull(message = "主鍵不能爲空",groups =Update.class)
private Long id;
//用戶名
@NotNull(message = "用戶名不能爲空")
private String userName;
//密碼
@NotNull(message = "密碼不能爲空")
private String password;
//性別
@NotNull(message = "性別不能爲空")
private String sex;
public @interface Update {
}
}
控制層代碼,BindingResult bindingResult 必須寫在方法的接收參數上,否則校驗失敗,校驗邏輯統一走@FwValidate切面處理
/**
* 添加用戶
* @Author xuyisu
* @Date 2019/10/25
* @Param [user]
* @Return com.yisu.common.result.FwResult
*/
@PostMapping
@ApiOperation(value = "創建用戶")
@FwValidate
public FwResult createUser(@Valid @RequestBody User user,BindingResult bindingResult) {
if(bindingResult.hasErrors())
{
return FwResult.failed();
}
FwResult userInfo=userService.createUser(user);
return userInfo;
}
/**
* 更新用戶
* @Author xuyisu
* @Date 2019/10/25
* @Param [user]
* @Return com.yisu.common.result.FwResult
*/
@PutMapping("/{id:\\d+}")
@ApiOperation(value = "更新用戶")
@FwValidate
public FwResult updateUser(@Validated(User.Update.class) @RequestBody User user,BindingResult bindingResult) {
if(bindingResult.hasErrors())
{
return FwResult.failed();
}
FwResult userInfo=userService.updateUser(user);
return userInfo;
}
3.swagger 配置
/**
* api頁面 /swagger-ui.html
* @author xuyisu
* @date 2019-10-15
*/
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Value("${swagger.enabled}")
private Boolean enabled;
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.enable(enabled)
.apiInfo(apiInfo())
.select()
.paths(Predicates.not(PathSelectors.regex("/error.*")))
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("接口文檔")
.version("1.0")
.build();
}
}
瀏覽器輸入http://localhost:8766/swagger-ui.html#
4.單元測試
/**
* @ClassName UserControllerTest
* @Author xuyisu
* @Description 模擬http測試
* @Date 2019/10/25
*/
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class UserControllerTest {
@Autowired
private WebApplicationContext wac;
private MockMvc mockMvc;
@Before
public void setup() {
mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();
}
@Test
public void whenGetUserInfoSuccess() throws Exception {
String result = mockMvc.perform(get("/user/1")
.contentType(MediaType.APPLICATION_JSON_UTF8))
.andExpect(status().isOk())
.andExpect(jsonPath("$.code").value(FwCommonConstants.SUCCESS))
.andReturn().getResponse().getContentAsString();
System.out.println(result);
}
//.......
//具體請看代碼`com.yisu.mock.UserControllerTest`
項目地址
Git: https://github.com/xuyisu/restful-api-demo
Gitee : https://gitee.com/gitxys/restful-api-demo