此刻您已经学会了如何利用 CXF 开拓基于 SOAP 的 Web 处事,也明确了 Spring + CXF 这个强大的组合,假如您错过了这出色的一幕,软件开发,请转头看看这篇吧:
Web Service 那点事儿(2) —— 利用 CXF 开拓 SOAP 处事
本日我们将视角会合在 REST 上,它是继 SOAP 今后,另一种遍及利用的 Web 处事。与 SOAP 差异,REST 并没有 WSDL 的观念,也没有叫做“信封”的对象,因为 REST 主张用一种简朴粗暴的方法来表达数据,通报的数据名目可以是 JSON 名目,也可以是 XML 名目,这完全由您来抉择。
REST 全称是 Representational State Transfer(表述性状态转移),它是 Roy Fielding 博士在 2000 年写的一篇关于软件架构气势气魄的论文,此文一出,威震四方!很多知名互联网公司开始回收这种轻量级 Web 处事,各人习惯将其称为 RESTful Web Services,或简称 REST 处事。
那么 REST 到底是什么呢?
REST 本质上是利用 URL 来会见资源的一种方法。总所周知,URL 就是我们泛泛利用的请求地点了,个中包罗两部门:请求方法 与 请求路径,较量常见的请求方法是 GET 与 POST,但在 REST 中又提出了几种其它范例的请求方法,汇总起来有六种:GET、POST、PUT、DELETE、HEAD、OPTIONS。尤其是前四种,正好与 CRUD(增删改查)四种操纵相对应:GET(查)、POST(增)、PUT(改)、DELETE(删),这正是 REST 的玄妙地址!
实际上,REST 是一个“无状态”的架构模式,因为在任何时候都可以由客户端发出请求随处事端,最终返回本身想要的数据。也就是说,处事端将内部资源宣布 REST 处事,客户端通过 URL 来会见这些资源,这不就是 SOA 所倡导的“面向处事”的思想吗?所以,REST 也被人们看做是一种轻量级的 SOA 实现技能,因此在企业级应用与互联网应用中都获得了遍及利用。
在 Java 的世界里,有一个名为 JAX-RS 的类型,它就是用来实现 REST 处事的,今朝已经成长到了 2.0 版本,也就是 JSR-339 类型,假如您想深入研究 REST,请深入阅读此类型。
JAX-RS 类型今朝有以下几种较量风行的实现技能:
本文以 CXF 为例,我尽力用最精辟的文字,软件开发,让您快速学会如何利用 CXF 开拓 REST 处事,另外还会将 Spring 与 CXF 做一个整合,让开拓越发高效!
那么还等什么呢?咱们一起出发吧!
1. 利用 CXF 宣布与挪用 REST 处事
第一步:添加 Maven 依赖
<!-- lang: xml --> <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>demo.ws</groupId> <artifactId>rest_cxf</artifactId> <version>1.0-SNAPSHOT</version> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <cxf.version>3.0.0</cxf.version> <jackson.version>2.4.1</jackson.version> </properties> <dependencies> <!-- CXF --> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxrs</artifactId> <version>${cxf.version}</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http-jetty</artifactId> <version>${cxf.version}</version> </dependency> <!-- Jackson --> <dependency> <groupId>com.fasterxml.jackson.jaxrs</groupId> <artifactId>jackson-jaxrs-json-provider</artifactId> <version>${jackson.version}</version> </dependency> </dependencies> </project>
以上添加了 CXF 关于 REST 的依赖包,并利用了 Jackson 来实现 JSON 数据的转换。
第二步:界说一个 REST 处事接口
<!-- lang: java --> package demo.ws.rest_cxf; import java.util.List; import java.util.Map; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.FormParam; 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 javax.ws.rs.core.MediaType; public interface ProductService { @GET @Path("/products") @Produces(MediaType.APPLICATION_JSON) List<Product> retrieveAllProducts(); @GET @Path("/product/{id}") @Produces(MediaType.APPLICATION_JSON) Product retrieveProductById(@PathParam("id") long id); @POST @Path("/products") @Consumes(MediaType.APPLICATION_FORM_URLENCODED) @Produces(MediaType.APPLICATION_JSON) List<Product> retrieveProductsByName(@FormParam("name") String name); @POST @Path("/product") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) Product createProduct(Product product); @PUT @Path("/product/{id}") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) Product updateProductById(@PathParam("id") long id, Map<String, Object> fieldMap); @DELETE @Path("/product/{id}") @Produces(MediaType.APPLICATION_JSON) Product deleteProductById(@PathParam("id") long id); }