用CXF开发RESTful风格WebService
版本
日期
调用webservice服务
修改历史
作者
0.1
2011627
文档创建
陈操

目 录
1    RESTful简要介绍    1
2    开发一个普通的接口    1
2.1    定义DTO    1
2.2    定义接口    2
2.3    实现类    2
3    开发RESTful风格WebService服务端    2
3.1    定义资源(定义DTO)    2
3.2    开发接口    3
3.3    实现类    4
3.4    配置CXF(整合Spring)    4
3.4.1    接口的Spring配置文件    4
3.4.2    CXF的Spring配置文件    4
3.4.3    修改l    5
4    开发RESTful风格WebService客户端(Java)    5
4.1    定义客户端接口    5
4.2    定义实现类    6

1 RESTful简要介绍
RESTful风格的WebService之所以当下如此流行,是由于其相对于SOAP风格的WebService更简洁、更轻量级,REST风格的WebService传输的是JSON或极其简洁的XML,因而其效率和性能都比较理想。
RESTful风格的WebService主张重用HTTP协议,面向资源编程(ROA)。扼要的说,RESTful风格WebService中,每一个URL即表示一个资源,比如ample/employees/1 表示id为1的员工。
1. 如果对此URL调用HTTP GET方法,则返回员工的XML形式;
2. 如果对此URL调用HTTP POST/PUT方法,则可以新增或者修改此员工;
3. 如果对此URL调用HTTP DELETE方法,则可以删除此员工;
因此,我们在设计一个RESTful风格的接口时,一定要拥有面向资源设计的考量!
此外,在实现接口的过程中,要遵循RESTful风格的几个特性,他们分别是:
1. 无状态性:HTTP本身即是无状态协议,因此RESTful天然的具备无状态性,具备优良的水平扩展能力!
2. 幂等性:GET/PUT/DELETE方法具备此特性,幂等性可概述为无论重复调用多少次,其结果都一致!POST例外,不过设计的时候也可以按照此特性设计!
3. 唯一性:即URL地址要唯一的表示一个资源!
关于事务、安全等更多的高级特性这里不阐述,有兴趣的可参考《Restful Web Service中文版》一书。
下面以开发一个普通接口和开发REST风格WebService接口为对比,指导大家快速入门。
2 开发一个普通的接口
2.1 定义DTO
public class Info implements Serializable {
    private String id;
    private String name;
    private String description;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
}
2.2 定义接口
public interface SaleService extends Serializable {
    public List<Info> getInfos();
    public Info getInfo(String id);
    public void saveOrUpdateInfo(Info info);
    public void deleteInfo(String id);
}
2.3 实现类
接口的实现,就此省略。
3 开发RESTful风格WebService服务端
3.1 定义资源(定义DTO)
@XmlRootElement(name = "Info")
public class Info implements Serializable {
    private String id;
    private String name;
    private String description;
    @XmlElement(name = "ID")
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    @XmlElement(name = "NAME")
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @XmlElement(name = "DESCRIPTION")
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
}
解析:@XmlRootElement(name = "Info")之类的注释,是JAXB规范,用于XMLJava对象之间的互相转换。不熟悉JAXB规范的可以自行搜索相关资料。
此Info对象对应的XML格式如下:
<Info>
<DESCRIPTION>des1</DESCRIPTION>
<ID>1</ID>
<NAME>name1</NAME>
</Info>
3.2 开发接口
@Produces({ MediaType.APPLICATION_XML })
public interface SaleService extends Serializable {
    @GET
    @Path("/infos")
    public List<Info> getInfos();
    @GET
    @Path("/infos/{id}")
    public Info getInfo(@PathParam("id") String id);
    @POST
    @Path("/infos")
    @Consumes({ MediaType.APPLICATION_XML, MediaType.TEXT_XML,
            MediaType.APPLICATION_JSON })
    public void saveOrUpdateInfo(Info info);
    @DELETE
    @Path("/infos/{id}")
    public void deleteInfo(@PathParam("id") String id);
}
解析:接口中的注释均为JSR311中的规范。
@Produces表示这个接口响应格式为XML
表示响应ample/.../infosGET请求,返回Info列表。
表示响应ample/.../infos/? GET请求,URL中的“?”作为参数代入方法中,最终返回对应的Info
表示响应ample/.../infos POST请求,可以接受APPLICATION_XMLTEXT_XMLJSON格式,最终保存Info对象。
表示响应ample/.../infos/? DELETE请求,URL中的“?”作为参数代入方法中,最终删除对应的Info

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。