在上一篇博客 WebService之CXF快速入门(附Demo演示)讲述了CXF的基本概念,并且演示了如何编写WebService的服务端、客户端,在本篇博客将演示使用CXF发布REST风格的服务。
一、REST
1、REST是什么?
REST
是一种软件架构模式,是一种能对HTTP
的利用实现精确的资源定位的风格。
举个栗子,如果不使用REST风格,常见的URL如下:
http://ip:port/queryUser.action?userType=student&id=001
http://ip:port/queryUser.action?userType=teacher&id=002
使用REST风格,则可以编写为如下URL:
http://ip:port/user/student/query/001
http://ip:port/user/teacher/query/001
通俗的讲,REST风格就是将URL中的参数划分为URL中的层级。
REST
≠ WebService-soap
,JAX-RS
只是将REST
设计风格应用到Web
服务开发上。
Rest
方式表示互联网上的资源更加准确,但是当目录的层级较多的时候,也存在不容易理解的缺点。
二、学生信息查询服务案例
发布查询学生信息的服务,以json和xml数据格式返回。
功能:
1.通过ID查询一个学生信息服务
2.查询所有学生信息服务
1、创建一个普通java项目
2、导入CXF的jar包到项目lib文件夹
①、在项目中新建lib文件夹
②、复制CXF支持包中的jar包到项目lib文件夹下
③、将项目中的lib文件夹标记为项目Library
。
3、编写Student模型(还要设置注解)
package cn.hestyle.model;
/**
* description: Student模型
*
* @author hestyle
* @version 1.0
* @className CXF Project 06 With REST->cn.hestyle.model.Student
* @date 2019-12-11 09:33
*
* 注意需要设置根节点,否者xml、json格式返回结果无法显示
**/
@XmlRootElement(name = "student")
public class Student {
private Integer id;
private String name;
private String age;
private String gender;
public Student() {
}
public Student(Integer id, String name, String age, String gender) {
this.id = id;
this.name = name;
this.age = age;
this.gender = gender;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
@Override
public String toString() {
return "cn.hestyle.model.Student{" +
"id=" + id +
", name='" + name + '\'' +
", age='" + age + '\'' +
", gender='" + gender + '\'' +
'}';
}
}
4、编写服务接口、实现类
StudentService
服务接口、注解
package cn.hestyle.service;
import cn.hestyle.model.Student;
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 java.util.List;
/**
* description: 学生服务接口
*
* @author hestyle
* @version 1.0
* @className CXF Project 06 With REST->StudentService
* @date 2019-12-11 09:38
*
* 设置为服务接口,并且REST的根目录为student
**/
@WebService
@Path("student")
public interface StudentService {
/**
* 通过id查询学生信息
* @param id 学生id
* @return 学生信息
*
* 设置为get请求,返回数据格式为xml,子路径为/queryStu/{id}
* id为url路径最后的参数,注入给方法中的id参数
*/
@GET
@Produces(MediaType.APPLICATION_XML)
@Path("/queryStu/{id}")
public Student queryStu(@PathParam("id") int id);
/**
* 查询所有学生信息
* @return 所有学生的信息list
*
* 设置为get请求,返回数据格式为json,子路径为/queryAllStu
*/
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/queryAllStu")
public List<Student> queryAllStu();
}
StudentServiceImpl
实现类
package cn.hestyle.service;
import cn.hestyle.model.Student;
import java.util.ArrayList;
import java.util.List;
/**
* description: StudentService接口实现类
*
* @author hestyle
* @version 1.0
* @className CXF Project 06 With REST->StudentServiceImpl
* @date 2019-12-11 09:41
**/
public class StudentServiceImpl implements StudentService {
@Override
public Student queryStu(int id) {
//为了简化操作,所以这里直接构造一个信息
return new Student(id, "hestyle", "2020", "糙汉子");
}
@Override
public List<Student> queryAllStu() {
List<Student> students = new ArrayList<Student>();
for (int id = 1; id < 4; ++id) {
Student student = new Student(id, "hestyle" + id, "2020" + id, "糙汉子");
students.add(student);
}
return students;
}
}
5、发布服务
package cn.hestyle.test;
import cn.hestyle.service.StudentServiceImpl;
import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
/**
* description: 测试服务发布
*
* @author hestyle
* @version 1.0
* @className CXF Project 06 With REST->Test01
* @date 2019-12-11 09:52
**/
public class Test01 {
public static void main(String[] args) {
JAXRSServerFactoryBean service = new JAXRSServerFactoryBean();
//1、设置服务接口
service.setResourceClasses(StudentServiceImpl.class);
//2、设置服务实现
service.setServiceBean(new StudentServiceImpl());
//3、设置地址
service.setAddress("http://127.0.0.1:12345");
//4、发布服务
service.create();
System.out.println("学生信息发布成功,请在浏览器访问url:");
System.out.println("http://127.0.0.1:12345/student/queryStu/学生id");
System.out.println("http://127.0.0.1:12345/student/queryAllStu");
}
}
然后再浏览器中访问上面的url,注意url必须与你设置的服务地址一致,如果你进行了修改!!
6、IDEA自带工具测试REST风格
这个工具在2019.2.3
版中有,在旧版就不知道了。