RESTful 中创建"资源"
RESTful 中所有的请求都是由资源来处理的。JAX-RS API实现的资源就是一个Java Class,这个Class被Annotated了
一个或多个Annotations; 使用JAX-RS实现的RESTful Web service是一个root resource class, 这个root resource class
service expose后的访问的入口,该root resource class可以自己处理request,也可以由其sub-resource来处理request;
即RESTfule 中有两种resource type: root resource class,sub-resource
1. Basic JAX-RS annotations
(1) URI template syntax: URI template syntax
(2) Specifying HTTP verbs
- javax.ws.rs.DELETE specifies that the method maps to a DELETE.
- javax.ws.rs.GET specifies that the method maps to a GET.
- javax.ws.rs.POST specifies that the method maps to a POST.
- javax.ws.rs.PUT specifies that the method maps to a PUT.
- javax.ws.rs.HEAD specifies that the method maps to a HEAD.
(3) Root resource classes
- Class被用于Root Class需满足一下条件:
- Class 必须被标注@Path注解;
- Class必须有一个公共的构造函数用于运行期间调用;
- Class中的Method至少有一个被标注HTTP verb或@Path
例如:
package demo.hw.server; import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.QueryParam; import javax.ws.rs.core.Response; @Path("/customerservice/") public class CustomerService { public CustomerService() { } @GET public Customer getCustomer(@QueryParam("id") String id){ } @DELETE public Response deleteCustomer(@QueryParam("id") String id){ } @PUT public Response updateCustomer(Customer customer){ } @POST public Response addCustomer(Customer customer){ } @Path("/orders/{orderId}/") public Order getOrder(@PathParam("orderId") String orderId){ } }
(4) Resource Method
- 所有的resource method需满足一下条件:
- 必须是public;
- 必须被标准HTTP Method 注解;
- 不能有多有一个的实体参数。
A. Resource Method的Paramter有两种类型:
entity parameters;
annotated parameters.
例如:
@POST @Path("disaster/monster/giant/{id}") public void addDaikaiju(Kaiju kaiju, @PathParam("id") String id){ }
B. Resource Method的Return values
void;
any Java class for which the application has an entity provider;
a Response object;
a GenericEntity<T> object.
所有的Resource Method返回一个HTTP Status Code给Request, 当返回值是void,null时,HTTP Status Code是
200; 若返回值是除了null之外的其他值时,HTTP Status Code是204.
(5) Sub-Resource
有两种实现方式:
- Sub-Resource method: 对sub-resource直接使用HTTP verb;
- Sub-resource locator:只想一个实现了sub-resource的class.
例如:Sub-resource methods :标注@Path注解和HTTP verb注解,sub-resource method直接响应处理request
中指定的HTTP verb.
@Path("/customerservice/") public class CustomerService { @Path("/orders/{orderId}/") @GET public Order getOrder(@PathParam("orderId") String orderId) { } @Path("/orders/{orderId}/") @PUT public Order updateOrder(@PathParam("orderId") String orderId, Order order) { } @Path("/orders/") @POST public Order newOrder(Order order) { } }
例如:Sub-resource locators:没有HTTP verb注解,也不直接处理request; 而是sub-resource locator返回
一个resource class instance来处理request,同时sub-resource不能有Entity Paramters.
@Path("/customerservice/") public class CustomerService{ @Path("/orders/{orderId}/") public Order processOrder(@PathParam("orderId") String orderId){ } } public class Order{ @GET public Order getOrder(@PathParam("orderId") String orderId){ } @PUT public Order updateOrder(@PathParam("orderId") String orderId,Order order){ } }
(7) Resource selection method
JAX-RS选择resource method 算法被分成三个阶段:
A. Determine the root resource class;
B. Determine the object will handle the request;
C. Select the resource method that will handle the request.
1. Selecting from multiple resource classes
当有多个resource匹配reqauest URI时,resource class优先于sub-resource;当有多个resource class时按照
下面的条件匹配:
(1) Prefer the resource with the most literal characters in its URI template;
(2) Prefer the resource with the most variables in its URI template
(3) Prefer the resource with the most variables containing regular expressions.
2.Selecting from multiple resource methods
按照下面的条件进行匹配:
(1) Prefer resource methods over sub-resources;
(2) Prefer sub-resource methods over sub-resource locaters;
(3) Prefer methods that use the most specific values in the @Consumes annotation and the @Produces
annotation; 例如:@Consumes(text/xml) > @Consumes(text/*) > @Consumes(*/*)
(4) Prefer methods that most closely match the content type of the request body entity; HTTP Content-Type
property.
(5) Prefer methods that most closely match the content type accepted as a response; HTTP Accept property.
3.Customizing the selection process
实现org.apache.cxf.jaxrs.ext.ResourceComparator.