在spring4中提供了rest风格编程的接口
Rest URL特点:
Rest风格会将参数当成URL的一部分,如在 URL 中实际请求为`/users/1`,1表示userId的值。Controller在获取时,@RequestMapping注解URL对应参数1部分用{userId}来代替,/users/{userId},获取参数时参数类型前加@Pathvariable注解来获取,如@Pathvariable String userId。
RESTful 使用 HTTP 动词表达对资源的操作类型。
|方法 |说明|
|GET |获取资源|
|POST |创建资源|
|PUT |更新资源,提供资源所需的所有属性|
|PATCH |更新资源,提供一个或多个将要修改的资源属性,在一定情况下可替代PUT方法
|DELETE |删除资源|
RESTful 设计中 HTTP 方法的安全性和幂等性。
|方法|安全性|幂等性|
|GET |是|是|
|POST |否|否|
|PUT |否|是|
|PATCH |否|是|
|DELETE |否|是|
**安全性** 安全的方法是只读的,不会改变资源的状态。
**幂等性** 幂等的方法会修改资源状态,但多次调用不会产生不同的结果。
举例说明:
GET 方法不会对资源造成修改所以是安全的,同时也是幂等的。
DELETE 方法对资源进行删除,不是安全的,但删除后再次调用时已经删除了,不会产生不同后结果,所以是幂等的。
POST 方法会创建一个资源,不是安全的,多次调用会创建多个资源,所以不是幂等的。
|状态码|适用HTTP方法|说明|
|200 OK|GET/PUT/PATCH|操作成功|
|201 Created|POST|创建成功|
|204 No Content|DELETE|删除成功|
|400 Bad Request|*|请求URL参数或请求体包含错误参数|
|401 Unauthorized|*|当前请求需要验证身份验证,需要有效`Authorization`头|
|403 Forbidden|*|身份已验证,但没有相应权限|
|404 Not Found|*|URL所指资源不存在|
|405 Method Not Allowed|*|URL不支持当前请求的方法|
|406 Not Acceptable|POST/PUT/PATCH|服务器不支持请求体的`Content-Type`|
|500 Internal Sever Error|*|服务器出现了不可预料的错误|
异常处理:
Spring中提供了@ControllerAdvice和@ExceptionHandler注解配合使用。需要单独写一个类,在这个类上使用@ControllerAdvice注解,表示该类用于处理抛出的异常。该类上可以写若干个方法,每一个方法处理一个异常,每个方法要加@ExceptionHandler注解,值为异常的class对象,表示处理该异常。方法可以返回一个map类型的json对象,加@ResponseBody注解即可。
Rest响应:
对于状态码以及响应体的返回,spring4.0 中提供了一个接口ResponseEntity。如果只返回状态码,可以用return new ResponseEntity<>(HttpStatus.OK)。如果需要返回响应体,则可以使用return new ResponseEntity<T>(T body, HttpStatus.OK)。其他详细使用方法可以参照spring4api。
传数据时都是用json格式来传送的。可以controller类上加@RestController注解(spring4.0新加的注解),该注解被@Controller和@ResponseBody注解。这样方法上就不用加@ResponseBody注解了。
@JsonView介绍
在向前端返回Json数据时,可以使用jackson的注解来自定义json数据。以下只简单介绍几个,其他注解详细用法可以百度。
@JsonView,可以用来注解属性,方法。这个注解需要配合使用,也就是说必须是成对出现的。例如:
首先需要建View接口
public interface WithoutPassword{}
public interface WithPassword extends WithoutPassword{}
在实体中属性上添加@JsonView注解,需要使用上面定义的接口
@JsonView(WithoutPassword.class)
private String username;
@JsonView(WithPassword.class)
private String password;
而在controller方法中,如果要求只返回username,则可以在方法上添加@JsonView(WithoutPassword.class),这样序列化对象时,password字段就不会被序列化。
这里有一个约定,就是controller方法上的@JsonView使用的视图可以允许该视图或者父视图(父接口)注解的字段被序列化。上面的例子中,WithPassword是WithoutPassword的子接口,所以没有被序列化。注意,视图接口是自定义的接口,且需要自己组织好继承关系,以方便自定义序列化。
@JsonIgnore
如果想直接不让一个字段序列化,可以在该字段上添加这个注解,这个注解默认值是true,表示序列化时忽略该字段。
@JsonProperty
可以指定该字段序列化成json格式时的名字