1.什么是REST服务
定义:REST就是一种编程风格,它可以精确定位网上资源(服务接口、方法、参数)
REST支持数据格式:XML、JSON
REST支持发送方式:GET,POST
2.REST服务和SOAP服务的比较
因为SOAP并不假定传输数据的下层协议,因此必须设计为能在各种协议上运行。即使绝大多数SOAP是运行在HTTP上,使用URI标识服务,SOAP也仅仅使用POST方法发送请求,用一个唯一的URI标识服务的入口。举一个图书馆在线查询管理系统为例,服务提供者必须为每一本书提供一个内部标识,然后可能定义一个listBooks操作来返回一系列图书,一个getBook操作来返回指定的图书,一个createBook操作来向数据库加入新增的图书,一个deleteBook操作来删除作废的图书,每个操作都有各自的参数,尤其是用内部标识来标识操作的图书。这种设计被诟病之处,在于deleteBook操作也要用POST方法来发送,而其实HTTP协议有更和逻辑的DELETE方法可用。REST正是这样设计的,REST为每一个资源(此处是图书)指定一个唯一的URI,而用HTTP的4种方法GET、POST、PUT、DELETE直观地表示获取、创建、更新和删除图书。同时图书集合也是和单本的图书不同的资源,如果用/books来代表图书列表,/books/ID来代表标识为ID的图书,那么对/books的GET操作就代表返回整个图书列表,对/books/ID的DELETE操作代表删除指定的图书,等等。
3.一个简单的实例
3.1 需求
发布一个服务可以用于查询一个学生和多个学生
3.2 实现
3.2.1 服务端开发
步骤
1.导入jar包
2.创建学生的pojo类,这里设置两个字段
package com.liaobei.pojo; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement public class Student { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
注意:在pojo类中加入@XmlRootElement 注释,否则会报错
该注释的作用是把java对象转换为xml格式
3.创建SEI接口
import java.util.List; import javax.jws.WebService; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import com.liaobei.pojo.Student; @WebService @Path("/student") public interface StudentInterface { @GET//指定请求方式,如果服务端发布的时候指定的是GET(POST),那么客户端访问时必须使用GET(POST) @Produces(MediaType.APPLICATION_XML)//指定服务数据类型 @Path("/query/{name}")//@Path("/query/{id}")就是将“/query”映射到方法上,“{id}”映射到参数上,多个参数,以“/”隔开,放到“{}”中 public Student queryStudent(@PathParam("name")String name); @GET @Produces(MediaType.APPLICATION_XML) @Path("/queryList/{name}") public List<Student> querySomeStudent(@PathParam("name")String name); }
4.创建SEI的实现类
import java.util.ArrayList; import java.util.List; import com.liaobei.pojo.Student; public class StudentInterfaceImpl implements StudentInterface { public Student queryStudent(String name) { Student s= new Student(); s.setId(1); s.setName("1"); return s; } public List<Student> querySomeStudent(String name) { Student s= new Student(); s.setId(1); s.setName("1"); Student s1= new Student(); s1.setId(2); s1.setName("2"); List<Student> li = new ArrayList<Student>(); li.add(s); li.add(s1); return li; } }
5.发布服务
import org.apache.cxf.jaxrs.JAXRSServerFactoryBean; public class StudentServer { public static void main(String[] args) { JAXRSServerFactoryBean bean = new JAXRSServerFactoryBean(); bean.setServiceBean(new StudentInterfaceImpl()); bean.setAddress("http://127.0.0.1:12345/user"); bean.setResourceClasses(StudentInterfaceImpl.class); bean.create(); } }
6.测试服务
输入http://127.0.0.1:12345/user/student/query/1 后若结果如下所示则发布成功