MVC
的RESTful
风格的实现RESTful
风格阐述REST
服务是一种ROA
(Resource-Oriented Architecture,面向资源的架构)应用。主要特色是方法信息存在于HTTP
协议的方法中(GET
,POST
,PUT
,DELETE
),做用域存在于URL
中。例如,在一个获取设备资源列表的GET
请求中,方法信息是GET
,做用域信息是URI种包含的对设备资源的过滤、分页和排序等条件==良好的
REST API
不须要任何文档==java
REST
风格资源路径REST
风格的资源路径设计是面向资源的,==资源的名称==应该是准确描述该资源的==名词==。web
资源路径概览:sheme://host:port/path?queryString
例:http://localhost:8080/bywlstudio/users/user?username=xiuerspring
HTTP
方法GET
用于==读取==、==检索==、==查询==、==过滤==资源
PSOT
用于==建立==一个资源apache
PUT
用于==修改==、==更新==资源、==建立客户端维护主键信息的资源==json
DELETE
用于==删除==资源tomcat
资源地址和HTTP
方法结合在一块儿就能够实现对资源的完整定位服务器
RESTful
风格API
设计上文讲述了经过HTTP方法和资源路径对服务器的一个资源进行定位的过程架构
接下来看一个REST风格API
的设计app
功能 | 描述 |
---|---|
添加/建立 | POST/users PUT/users{id} 1 |
删除 | DELETE/users/{id} |
修改/更新 | PUT/users/{id} |
查询所有 | GET/users |
主键查询 | GET/users/{id} GET/users?id=26 |
分页做用域查询 | GET/users?start=0&size=10 GET/users?07,2019-07,2020 |
能够看到经过这个RESTAPI
都是经过对==同一个资源==的操做,所不一样的就是经过不一样的==HTTP方法==来实现对资源不一样的处理。maven
MVC
对REST
的支持@Controller
声名一个处理请求的控制器@RequestMapping
请求映射地址,它存在几个子注解对于实现REST
风格来讲更加具备==语义性==
@GETMapping
==GET请求==@PUTMapping
==PUT请求==@POSTMapping
==POST请求==@DELETEMapping
==DELETE请求==@ResponseBody
将响应内容转换为JSON
格式@RequestBody
请求内容转换为JSON
格式@PathVariable("id")
用于绑定一个参数@RESTController
等同于@Controller
+@ResponseBody
在类上写了这个注解,标识这个类的全部方法只==返回数据==,而不进行==视图跳转==HTTP
状态码REST
风格API
一个最鲜明的特色经过返回对应的HTTPStatus
来判断客户端的操做是否完成
==下面是spring中关于Http
状态码描述的枚举类,本文列举了常见的状态码==(读者若对此感兴趣能够查看HttpStatus
源码)
public enum HttpStatus{ OK(200, "OK"),//用于服务器有实体响应 CREATED(201, "Created"),//建立了新实体,响应该实体 NO_CONTENT(204, "No Content"),//服务器正常响应,但无实体响应 BAD_REQUEST(400, "Bad Request"),//客户端请求语法错误 NOT_FOUND(404, "Not Found"),//目标资源不存在 INTERNAL_SERVER_ERROR(500, "Internal Server Error"),//服务器内部错误 NOT_IMPLEMENTED(501, "Not Implemented"),//服务器不支持当前请求 }
Spring返回状态码是经过@ResponseStatus
注解或者ResponseEntity<?>
类实现的。
==@ResponseStatus
方式==
@GetMapping(path = "/user/{id}" , produces = "application/json;charset=utf-8") @ResponseStatus(HttpStatus.OK) public User findUserById(@PathVariable("id")Integer id){ User user = userService.findUserById(id); return user ; }
==ResponseEntity<?>
==方式
@GetMapping(produces = "application/json;charset=utf-8") public ResponseEntity<List<User>> findAll(){ List<User> users = userService.findAll(); return new ResponseEntity<List<User>>(users , HttpStatus.OK); }
MVC
默认不支持PUT
和DELETE
方法,因此须要手动开启在tomcat
服务器的web.xml
文件中开启一下配置
<servlet> <servlet-name>default</servlet-name> <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class> <init-param> <param-name>debug</param-name> <param-value>0</param-value> </init-param> <init-param> <param-name>listings</param-name> <param-value>false</param-value> </init-param> <init-param> <param-name>readonly</param-name> <param-value>true</param-value><!--开启这个--> </init-param> <load-on-startup>1</load-on-startup> </servlet>
在项目的web.xml
中配置
<filter> <filter-name>HiddenHttpMethodFilter</filter-name> <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> </filter> <filter-mapping> <filter-name>HiddenHttpMethodFilter</filter-name> <servlet-name>dispathcherServlet</servlet-name> </filter-mapping>
MVC
实现REST
代码实现JDK1.8
maven3.60
tomcat9
API
设计URI | Description | Response | HTTPStatus |
---|---|---|---|
==GET==/users | 获取所有用户 | JSON |
200 |
==GET==/users/{id} | 获取指定主键的用户 | JSON |
200 |
==PUT==/users/{id} | 修改指定的主键的用户信息 | JSON |
200/201 |
==POST==/users | 增长一个用户 | JSON |
201 |
==DELETE==/users/{id} | 删除一个用户 | void |
204 |
@RestController @RequestMapping("/users") public class UserControler { @Autowired private IUserService userService ; //REST风格实现方法 /** * 查询全部 * @return */ @GetMapping(produces = "application/json;charset=utf-8") public ResponseEntity<List<User>> findAll(){ List<User> users = userService.findAll(); return new ResponseEntity<List<User>>(users , HttpStatus.OK); } /**、 * 根据ID查询 * @param id * @return */ @GetMapping(path = "/{id}" , produces = "application/json;charset=utf-8") @ResponseStatus(HttpStatus.OK) public User findUserById(@PathVariable("id")Integer id){ User user = userService.findUserById(id); return user ; } /** * 增长一个用户 * 返回该用户 */ @PostMapping(produces = "application/json;charset=utf-8") @ResponseStatus(HttpStatus.CREATED) public User addUser(@RequestBody User user){ User newUser = userService.addUser(user); return newUser ; } /** * 更新 * @param user */ @PutMapping(path = "/{id}" ,produces = "application/json;charset=utf-8") public ResponseEntity<User> updateUser(@PathVariable("id") Integer id , @RequestBody User user){ user.setUid(id); //资源是否修改 boolean flag = userService.updateUser(user); User deUser = userService.findUserById(id); if(flag) return new ResponseEntity<User>(deUser,HttpStatus.CREATED); return new ResponseEntity<User>(deUser,HttpStatus.OK); } @DeleteMapping(path = "/{id}" , produces = "application/json;charset=utf-8") @ResponseStatus(HttpStatus.NO_CONTENT) public void delUser(@PathVariable("id") Integer id){ User user = userService.findUserById(id); userService.delUser(id); } }
更多原创文章和Java学习资料@公众号MakerStack