一.概念
1.REST 是一种软件架构模式,只是一种风格
2.rest服务采用HTTP 做传输协议
3.REST 对于HTTP 的利用实现精确的资源定位
rest要求对资源定位更加准确,如下:
非rest方式:
http://ip:port/queryUser.action?userType=student&id=001
http://ip:port/queryUser.action?userType=teacher&id=002
Rest方式:
http://ip:port/user/student/query/001
http://ip:port/user/teacher/query/001
4.Rest方式表示互联网上的资源更加准确,但是也有缺点,可能目录的层级较多不容易理解
5.REST 是一种软件架构理念,现在被移植到Web 服务上,那么在开发Web 服务上,偏于面向资源的服务适用于REST,REST 简单易用,效率高,SOAP 成熟度较高,安全性较好。
eg:
对于资源的具体操作类型,由HTTP动词表示。
常用的HTTP动词有下面五个(括号里是对应的SQL命令)
GET(SELECT):从服务器取出资源(一项或多项)。
POST(CREATE):在服务器新建一个资源。
PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)。
PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性)。
DELETE(DELETE):从服务器删除资源。
下面是一些例子
GET /zoos:列出所有动物园
POST /zoos:新建一个动物园
GET /zoos/ID:获取某个指定动物园的信息
PUT /zoos/ID:更新某个指定动物园的信息(提供该动物园的全部信息)
PATCH /zoos/ID:更新某个指定动物园的信息(提供该动物园的部分信息)
DELETE /zoos/ID:删除某个动物园
GET /zoos/ID/animals:列出某个指定动物园的所有动物
DELETE /zoos/ID/animals/ID:删除某个指定动物园的指定动物
二.Jersey介绍
Jersey RESTful 框架是开源的RESTful框架, 实现了JAX-RS (JSR 311 & JSR 339) 规范。它扩展了JAX-RS 参考实现, 提供了更多的特性和工具, 可以进一步地简化 RESTful service 和 client 开发。尽管相对年轻,它已经是一个产品级的 RESTful service 和 client 框架。与Struts类似,它同样可以和hibernate,spring框架整合。
Jersey 是一个非常不错的框架。对于请求式服务,对于GET,DELETE请求,你甚至只需要给出一个URI即可完成操作。
三.Jersey开发restful webService demo
1.创建web项目
2.导包
jersey包
3.编写JavaBean
Student
package com.miracle.model;
import javax.xml.bind.annotation.XmlRootElement;
// 如果要返回xml通过XmlRootElement 指定xml跟标签的名字
@XmlRootElement(name = "stu")
public class Student {
private Long id;
private String username;
private String password;
public Student() {
}
public Student(Long id, String username, String password) {
this.id = id;
this.username = username;
this.password = password;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
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;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
4.编写controler(web层)
package com.miracle.restWebService;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.miracle.model.Student;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
//设定访问路径
@Path("/student")
public class StudentServlet {
private ObjectMapper objectMapper = new ObjectMapper();
/**
* 根据id查找学生
* @return
*/
// @PathParam("id") 将 @Path("/query/{id}") 接收的id参数赋值给 queryById中的参数id
@GET //设定为接收GET请求
@Path("/queryById/{id}") //设定访问路径
@Produces(MediaType.APPLICATION_XML) //设定返回给客户端的数据格式(xml or json)
public Student queryById(@PathParam("id") long id) throws JsonProcessingException {
// 模拟数据,正常调用service层,然后调用dao层查询数据
Student student = new Student(id, "miracle", "123456");
// 注意当需要返回xml时,这里不再需要转换json了,直接返回对象,由框架转换成xml
return student;
}
/**
* 根据名字查询所有的学生
* @return
*/
// @PathParam("name")作用 将 @Path("/queryByName/{name}") 接收的name参数赋值给 queryByName中的参数name
@GET //设定为接收GET请求
@Path("/queryByName/{name}") //设定访问路径
@Produces(MediaType.APPLICATION_JSON) //设定返回给客户端的数据格式(xml or json)
public String queryByName(@PathParam("name") String name) throws JsonProcessingException {
// 模拟数据,正常调用service层,然后调用dao层查询数据
List<Student> students = new ArrayList<Student>();
for (long i = 0; i < 3; i++) {
Student student = new Student(i, name, "123456");
students.add(student);
}
// 由自己转json
return objectMapper.writeValueAsString(students);
}
@POST //设定为接收POST请求
@Path("/add/{json}") // 注意:客户端访问的时候要有“/json”路径 即 /add/json
@Consumes(MediaType.APPLICATION_JSON) // 告诉方法post请求发来的数据是json
@Produces(MediaType.APPLICATION_JSON) // 设定返回给客户端的数据格式(xml or json)
public String add(String json) throws IOException { // 这里add 方法的参数不需要添加注解
System.out.println(json);
Student student = objectMapper.readValue(json, Student.class);
// 调用Service层进行处理
System.out.println(student);
return "ok";
}
@POST //设定为接收POST请求
@Path("/addByXML") // 客户端访问路径到 /addByXML 即可
@Consumes(MediaType.APPLICATION_XML) // 告诉方法post请求发来的数据是xml
@Produces(MediaType.APPLICATION_XML) // 设定返回给客户端的数据格式(xml or json)
public String addByXML(String xml){ // 这里addByXML 方法的参数不需要添加注解
System.out.println(xml);
// 调用Service层进行处理
String result = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<stu>\n" +
" <Courses>\n" +
" <Course1>math</Course1>\n" +
" <Course2>english</Course2>\n" +
" <Course3>chinese</Course3>\n" +
" </Courses>\n" +
" <Id>1</Id>\n" +
" <Password>123456</Password>\n" +
" <Username>miracle</Username>\n" +
"</stu>";
return result;
}
}
5.web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<!-- 配置jersey提供的Servlet-->
<servlet>
<servlet-name>jersey-servlet</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<!-- 设置servelt参数,配置rest服务包名-->
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.miracle.restWebService</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>jersey-servlet</servlet-name>
<!-- 设定访问路径 -->
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>