REST 在 2000 年由 Roy Fielding 在博士论文中提出,他是 HTTP 规范 1.0 和 1.1 版的首席作者之一。
REST 中最重要的概念是资源(resources),使用全球 ID(通常使用 URI)标识。客户端应用程序使用 HTTP 方法(GET/ POST/ PUT/ DELETE)操作资源或资源集。RESTful Web 服务是使用 HTTP 和 REST 原理实现的Web 服务。通常,RESTful Web 服务应该定义以下方面:
- Web 服务的基/根 URI,比如 http://host/<appcontext>/resources。
- 支持 MIME 类型的响应数据,包括 JSON/XML/ATOM 等等。
- 服务支持的操作集合(例如 POST、GET、PUT 或 DELETE)。
Jersey的四种行为
方法
HTTP 方法映射到资源的 CRUD(创建、读取、更新和删除) 操作。尽管您可以做一些小修改,比如让 PUT
方法变成创建或更新,但基本的模式如下:
- HTTP
GET
:获取/列出/检索单个资源或资源集合。 - HTTP
POST
:新建资源。 - HTTP
PUT
:更新现有资源或资源集合。 - HTTP
DELETE
:删除资源或资源集合。
方法/资源 |
资源集合; URI 如: |
成员资源; URI 如: |
对应的操作 |
POST |
列出资源集合的所有成员。 |
检索标识为 1234 的资源的表示形式。 |
C(创建) |
GET |
使用一个集合更新(替换)另一个集合。 |
更新标记为 1234 的数字资源。 |
R(读取) |
PUT |
在集合中创建数字资源,其ID 是自动分配的。 |
在下面创建一个子资源。 |
U(更新) |
DELETE |
删除整个资源集合。 |
删除标记为 1234 的数字资源。 |
D(删除) |
相关的架包结构
· 核心服务器:jersey-core.jar,jersey-server.jar,jsr311-api.jar,asm.jar
· 核心客户端:(用于测试)jersey-client.jar
· JAXB 支持:(在高级样例中使用)jaxb-impl.jar,jaxb-api.jar,activation.jar,stax-api.jar,wstx-asl.jar
· JSON 支持:(在高级样例中使用)jersey-json.jar
· Spring支持:(在高级样例中使用)jersey-spirng.jar
元注解信息说明
生存周期说明
1. 默认不使用注解,表示生存周期等于request,请求过后自动销毁,默认是线程安全的。
2. application,使用@Singleton注解。生存周期等于整个应用程序的生存周期。
3. session,使用@PerSession注解。生存周期等于一个session请求,session销毁,该rest资源实例也同时销毁。
Bean注解说明
1.@Path
路径信息,表示映射出去的访问路径。
范例如下:@Path("/myResource")
2. @Produces
用于限制post和get方法返回的参数类型,支持json、string、xml、html
范例如下:@Produces({"application/xml", "application/json"})
3. @Consumes
用于限制输入的参数的类型,支持json、string、xml、html
范例如下:@Consumes("text/plain")
4. @QueryParam
通过request传入的参数,可以转换任何有以String为参数的构造函数的类。
5.@DefaultValue
@DefaultValue表示默认参数。
范例如下:@DefaultValue("2") @QueryParam("step") int step,
5. @PathParam
@ MatrixParam,@ HeaderParam,@ CookieParam和@ QueryParam FormParam听从以相同的规则。
@ MatrixParam提取URL路径段的信息。 @ HeaderParam提取的HTTP头信息。 @ CookieParam提取信息的Cookie饼干宣布相关的HTTP标头。
@ FormParam略有特殊,因为它提取请求表示,该类型匹配前面的@Consumes所声明的类型。
范例如下:
@POST
@Consumes("application/x-www-form-urlencoded")
public void post(@FormParam("name") String name) {
6.pojo层面等相关注解,@XmlRootElement,支持JPA注解。
7.Spring相关注解,比如@Autowired(required=true) 、@Qualifier("persionDao")、@Component
@Scope("request")
//输出json中JSONObject或JSONArray的名字 @XmlRootElement(name="rootclass") public class Bean { private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <display-name>RESTfulWS</display-name> <servlet> <servlet-name>Jersey REST Service</servlet-name> <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> <init-param> <param-name>com.sun.jersey.config.property.packages</param-name> <param-value>com.hiekn.poa.service</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Jersey REST Service</servlet-name> <url-pattern>/ws/*</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> </web-app>
@Path("rs") public class TestService { @GET @Path("/hello1/{name}") @Produces("application/json;charset=UTF-8") public String sayHello(@PathParam("name") String name) { return "Hello, ".concat(name); } @GET @Path("/hello2/{name}") @Produces("application/json;charset=UTF-8") public Bean sayHello2(@PathParam("name") String name) { Bean b = new Bean(); b.setUsername(name); b.setPassword("mlgb"); return b; } @GET @Path("/hello3/{name}") @Produces("application/json;charset=UTF-8") public List<Bean> sayHello3(@PathParam("name") String name) { List<Bean> rsList = new ArrayList<Bean>(); Bean b = new Bean(); b.setUsername(name); b.setPassword("mlgb"); rsList.add(b); return rsList; } @GET @Path("/hello4") @Produces("application/json;charset=UTF-8") public List<Bean> sayHello4(@QueryParam("username") String username, @QueryParam("password") String password) { List<Bean> rsList = new ArrayList<Bean>(); Bean b = new Bean(); b.setUsername(username); b.setPassword(password); rsList.add(b); return rsList; } }