如何封装RESTful Web Service
所谓Web Service是一个平台独立的,低耦合的,自包含的、可编程的Web应用程序,有了Web Service异构系统之间就可以通过XML或JSON来交换数据,这样就可以用于开发分布式的互操作的应用程序。Web Service使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件就可相互交换数据或集成,无论它们各自所使用的语言、平台或内部协议是什么,都可以相互交换数据。Web Service为整个企业甚至多个组织之间的业务流程的集成提供了一个通用机制。
REST(REpresentational State Transfer)是Roy Fielding博士于2000年在他的博士论文中提出来的一种软件架构风格。它是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性。近年来,越来越多的Web Service开始采用REST风格设计和实现。例如,亚马逊提供接近REST风格的Web Service进行图书查找;雅虎提供的Web Service也是REST风格的。
如果要对REST有更深入的了解和更深刻的认识,推荐大家阅读InfoQ上面的一篇文章《理解本真的REST架构风格》。相信很多自以为懂REST的人看完这篇文章之后才知道什么是真正的REST。在IBM的开发者社区中有一篇非常好的文章,名为《使用Spring 3来创建RESTful Web Services》,讲解如何用springWeb和Spring MVC来创建REST风格的Web Service。由于这篇文章已经讲得很好了,这里我就不再赘述其中的内容。
这里要讲的是基于Apache CXF来创建RESTful Web Service。可以在Apache的网站下载到CXF的发行版本。Apache的官网是这样介绍CXF的:
Apache CXF is an open source services framework. CXF helps you build and develop services using frontend programming APIs, like JAX-WS and JAX-RS. These services can speak a variety of protocols such as SOAP, XML/HTTP, RESTful HTTP, or CORBA and work over a variety of transports such as HTTP, JMS or JBI.
下载完成后解压并找到lib目录,将其中的jar文件添加你的Java项目中,接下来就可以开始编写你的Web Service程序了。话不多说,直接上代码。
package com.lovo.domain;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "Student")
public class Student {
private Integer id;
private String name;
private String birthday;
public Student() {
}
public Student(Integer id, String name, String birthday) {
this.id = id;
this.name = name;
this.birthday = birthday;
}
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 getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
}
package com.lovo.infrastructure;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.lovo.domain.Student;
public class StudentRepository {
private Map<Integer, Student> map = new HashMap<>();
public StudentRepository() {
map.put(1001, new Student(1001, "骆昊", "1980-11-28"));
map.put(1002, new Student(1002, "王大锤", "1992-2-2"));
map.put(1003, new Student(1003, "张三丰", "1930-3-3"));
}
public void save(Student student) {
if (student != null) {
map.put(student.getId(), student);
}
}
public void delete(Student student) {
if (student != null && map.containsKey(student.getId())) {
map.remove(student.getId());
}
}
public void update(Student student) {
delete(student);
save(student);
}
public Student findById(Integer id) {
return map.get(id);
}
public List<Student> findAll() {
return new ArrayList<Student>(map.values());
}
}
package com.lovo.service;
import java.util.List;
import javax.ws.rs.Consumes;
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.Produces;
import com.lovo.domain.Student;
import com.lovo.infrastructure.StudentRepository;
@Path("/service")
@Produces("application/json")
public class StudentService {
private StudentRepository studentRepo = new StudentRepository();
@GET
@Path("/stu/{id}")
@Consumes("application/json")
public Student getStudent(@PathParam("id") Integer id) {
return studentRepo.findById(id);
}
@GET
@Path("/stu")
@Consumes("application/json")
public List<Student> getAllStudents() {
return studentRepo.findAll();
}
@POST
@Path("/stu")
@Consumes("application/json")
public boolean addStudent(Student student) {
if (getStudent(student.getId()) == null) {
studentRepo.save(student);
return true;
}
return false;
}
@PUT
@Path("/stu/{id}")
@Consumes("application/json")
public boolean updateStudent(@PathParam("id") Integer id, Student student) {
if (getStudent(id) != null) {
studentRepo.update(student);
return true;
}
return false;
}
@DELETE
@Path("/stu/{id}")
@Consumes("application/json")
public boolean deleteStudent(@PathParam("id") Integer id) {
Student student = getStudent(id);
if (student != null) {
studentRepo.delete(student);
return true;
}
return false;
}
}
最后来启动Web Service的服务器并进行测试。
package com.lovo;
import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
import com.lovo.domain.Student;
import com.lovo.service.StudentService;
public class MyRestServer {
public static void main(String[] args) {
JAXRSServerFactoryBean myRESTfulServer = new JAXRSServerFactoryBean();
myRESTfulServer.setResourceClasses(Student.class);
myRESTfulServer.setServiceBean(new StudentService());
myRESTfulServer.setAddress("http://localhost:9999/");
myRESTfulServer.create();
}
}
在浏览器中分别输入以下两个URI查看结果:
http://localhost:9999/service/stu/1002
http://localhost:9999/service/stu
如何封装RESTful Web Service的更多相关文章
- 怎样封装RESTful Web Service
所谓Web Service是一个平台独立的,低耦合的.自包括的.可编程的Web应用程序.有了Web Service异构系统之间就能够通过XML或JSON来交换数据,这样就能够用于开发分布式的互操作的应 ...
- MEAN Stack:创建RESTful web service
本文在个人博客上的地址为URL,欢迎品尝. 前段时间做了DTREE项目中的前后端数据存储功能,在原有的ngController上进行HTTP请求,后端接受到请求后再存储到mongoDB上.现将学习所得 ...
- day01(RESTful Web Service、SVN)
今日大纲 搭建SSM环境 基于SSM环境实现用户管理系统 学习RESTful Web Service 学习SVN 统一开发环境 JDK1.7 32? 64? -- 64 Eclipse 使用4.4.1 ...
- Django实战(15):Django实现RESTful web service
曾几何时,Ajax已经统治了Web开发中的客户端,而REST成为web世界中最流行的架构风格(architecture style).所以我们的选择变得很简单:前端ajax访问后端的RESTful w ...
- WCF实现RESTFul Web Service
共同学习了前面一些概念,终于开始正题了哈.RESTful的Web Service调用直观,返回的内容容易解析.这里先会描述一个简单的场景--Web Service提供一个方法来搜索个人信息,传入人名, ...
- 用Jersey为Android客户端开发Restful Web Service
平时在做Android客户端的时候经常要与服务器之间通信,客户端通过服务端提供的接口获取数据,然后再展示在客户端的界面上,作为Android开发者,我们平时更多的是关注客户端的开发,而对服务端开发的关 ...
- 【转】基于CXF Java 搭建Web Service (Restful Web Service与基于SOAP的Web Service混合方案)
转载:http://www.cnblogs.com/windwithlife/archive/2013/03/03/2942157.html 一,选择一个合适的,Web开发环境: 我选择的是Eclip ...
- 【转】 Build a RESTful Web service using Jersey and Apache Tomcat 2009
Build a RESTful Web service using Jersey and Apache Tomcat Yi Ming Huang with Dong Fei Wu, Qing GuoP ...
- Building a RESTful Web Service Using Spring Boot In Eclipse
一.构建restful web service 创建Maven的java web工程,maven的pom文件加入依赖包 创建包hello Greeting.java package hello; pu ...
随机推荐
- ef 操作 mysql 中文乱码问题
1.保证mysql数据的编码为utf8 启动mysql mysql -hlocalhost -uroot -p 输入密码 show VARIABLES like 'character_%'; SET ...
- Ionic开发-搭建开发环境
1安装node.js 2安装ionic & cordova: 命令行输入:npm install –g cordova ionic 注:-g表示全局安装,也可以进入指定的目录安装,但这里推荐全 ...
- 使用Robot类模拟鼠标、键盘事件
Robot类用于模拟鼠标.键盘事件,生成本机系统输入事件.Robot 的主要用于自动化.自运行的程序和其他需要自动控制鼠标和键盘的程序 相当于实际操作的效果,不仅仅只是生成对应的鼠标.键盘事件.比如R ...
- 记录:swift学习笔记1-2
swift还在不断的更新做细微的调整,都说早起的鸟儿有虫吃,那么我们早点出发吧,趁着国内绝大多数的coder们还没有开始大范围普遍应用. 网上有些大神说:swift很简单!我不同意这个观点,假如你用h ...
- PHPStorm2017.1.3永久激活方法之本地破解激活
是时候升级你的phpstorm了,咱们马上行动! 下载 1.phpstorm https://www.jetbrains.com/phpstorm/download/ 2.破解包 破解补丁无需使用注册 ...
- VC中包含的头文件名不区分大小写
VC中包含的头文件名,不区分大小写如 #include "my.h" = #include "MY.H".
- iOS VIPER架构(三)
路由是实现模块间解耦的一个有效工具.如果要进行组件化开发,路由是必不可少的一部分.目前iOS上绝大部分的路由工具都是基于URL匹配的,优缺点都很明显.这篇文章里将会给出一个更加原生和安全的设计,这个设 ...
- Linux Shell流程例子
#!/bin/bash read -p "input a dight:"echo $REPLY DATE=`date`echo "DATE is ${DATE}" ...
- 编写sql查询语句思路
编写查询语句思路/* 1.首先确定最终输出结果的列,包括几个方面:A.首先这些列来自于一个 表.还是多个表,如果是多个表则可能用到多表查询的(等值连接.不等值 连接.外连接.自连接):B.这些列是直接 ...
- HDU 4738 Caocao's Bridges taijan (求割边,神坑)
神坑题.这题的坑点有1.判断连通,2.有重边,3.至少要有一个人背*** 因为有重边,tarjan的时候不能用子结点和父节点来判断是不是树边的二次访问,所以我的采用用前向星存边编号的奇偶性关系,用^1 ...