spring rest风格编程



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使用的视图可以允许该视图或者父视图(父接口)注解的字段被序列化。上面的例子中,WithPasswordWithoutPassword的子接口,所以没有被序列化。注意,视图接口是自定义的接口,且需要自己组织好继承关系,以方便自定义序列化。

 

@JsonIgnore

如果想直接不让一个字段序列化,可以在该字段上添加这个注解,这个注解默认值是true,表示序列化时忽略该字段。

@JsonProperty

可以指定该字段序列化成json格式时的名字

你可能感兴趣的:(java,spring,REST)