通常的API都是什么样子的呢?java
查询 /user/query?name=tom GET 详情 /user/getInfo?id=1 GET 建立 /user/create?name=tom POST 修改 /user/update?id=1&name=jay POST 删除 /user/delete?id=1 GET
那么咱们但愿的RESTFul API 是什么样子的呢?git
查询 /user?name=tom GET 详情 /user/1 GET 建立 /user POST 修改 /user/1 PUT 删除 /user/1 DELETE
简单的说,RESTFul就是:
一、用URL描述资源
二、使用HTTP方法描述行为,使用HTTP状态码来表示不一样的结果
三、使用json交互数据
四、RESTFul只是一种风格,并非强制的标准github
Level0:使用Http做为传输方式
Level1:引入资源概念,每一个资源都有对应的URL
Level2:使用HTTP方法进行不一样的操做,使用HTTP状态码来表示不一样的结果
Level3:使用超媒体,在资源的表达中包含了连接信息
首先咱们先了解一些经常使用的注解web
一、@RestController 标明此Controller提供RestAPI
二、@RequestMapping及其变体。映射http请求URL到java方法
三、@RequestParam 映射请求参数到java方法的参数
四、@PageableDefault指定分页参数默认值正则表达式
直接拿出代码模块来说解吧!spring
package com.myself.web.controller; import com.fasterxml.jackson.annotation.JsonView; import com.myself.dto.User; import com.myself.dto.UserQueryCondition; import org.apache.commons.lang3.builder.ReflectionToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; import org.springframework.data.domain.Pageable; import org.springframework.data.web.PageableDefault; import org.springframework.web.bind.annotation.*; import java.util.ArrayList; import java.util.List; /** * @author MySelf * @create 2018/9/15 * @desc User Controller 层 **/ @RestController @RequestMapping("/user") public class UserController { /** * 获取用户列表 * @RequestMapping(value = "/user", method = RequestMethod.GET) * @RequestParam(name = "username",required = false,defaultValue = "tom") String nickname * @param condition {@link UserQueryCondition} * @return {@link List} */ @GetMapping() @JsonView(User.UserSimpleView.class) public List<User> query(UserQueryCondition condition,@PageableDefault(page = 2,size = 17,sort = "username,asc") Pageable pageable){ //反射工具 System.out.println(ReflectionToStringBuilder.toString(condition, ToStringStyle.MULTI_LINE_STYLE)); System.out.println(pageable.getPageSize()); System.out.println(pageable.getPageNumber()); System.out.println(pageable.getSort()); List<User> users = new ArrayList<>(); users.add(new User()); users.add(new User()); users.add(new User()); return users; } /** * 获取用户信息 正则校验参数必须为数字 * @RequestMapping(value = "/user/{id:\\d+}", method = RequestMethod.GET) * @param idxxx {@link String} * @return {@link User} */ @GetMapping("/{id:\\d+}") @JsonView(User.UserDetailView.class) public User getInfo(@PathVariable(name = "id") String idxxx){ User user = new User(); user.setUsername("tom"); return user; } }
User Bean 对象apache
package com.myself.dto; import com.fasterxml.jackson.annotation.JsonView; /** * @author MySelf * @create 2018/9/15 * @desc User Bean **/ public class User { /** 用户简单视图 */ public interface UserSimpleView {} /** 用户详情视图 */ public interface UserDetailView extends UserSimpleView {} /** 用户名 */ private String username; /** 用户密码 */ private String password; @JsonView(UserSimpleView.class) public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } @JsonView(UserDetailView.class) public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
接下来咱们就来说解一些注解的使用点,其实看着注解也能大体了解了。json
首先咱们在接受参数时,可使用@PathVariable映射url片断到java方法的参数,同时也支持在url声明中使用正则表达式,使用@JsonView控制json输出内容。app
咱们须要在Bean中声明对应的接口,并在值对象的get方法上指定视图,最后在Controller方法上指定视图便可。dom
还有就是,当咱们在处理建立请求时,还要注意可使用@RequestBody映射请求体到java方法参数,且要注意对日期类型参数的处理,也可使用@Valid注解和BindingResult验证请求参数的合法性并处理校验结果。
本文是针对UncleCatMySelf/myself-security(基于Spring Security + Spring Social + Spring Security OAuth + REST服务开发的案例教程,Maven多模块开发)的GitHub项目的基础演进。
若是本文对你有所帮助,欢迎关注本人技术公众号,谢谢。