在这里简单的说下CXF对REST的支持,先对REST概念说下。java
REST 是一种软件架构模式,只是一种风格,不是像SOAP 那样自己承载着一种消息协议,也能够叫作REST 是基于HTTP协议的软件架构。web
REST 中重要的两个概念就是资源定位和资源操做,而HTTP 协议刚好完整的提供了这两个要点,HTTP 协议中的URI 能够完成资源定位,GET、POST、OPTION等方法能够完成资源操做,所以REST 彻底依赖HTTP 协议就能够完成Web 服务,而不像SOAP 协议那样只利用HTTP 的传输特性,定位与操做由SOAP 协议自身完成,也正是因为SOAP 消息的存在,使得SOAP 笨重。你也能够说REST 充分利用了HTTP 协议的特性,而不是像SOAP 那样只利用了其传输这一特性(事实上大多数人提到HTTP 协议就只会想到它能用于数据传输)。spring
REST 是一种软件架构理念,如今被移植到Web 服务上(所以不要提到REST 就立刻想到WebService,JAX-RS 只是将REST 设计风格应用到Web 服务开发),那么在开发Web 服务上,偏于面向资源的服务适用于REST,偏于面向活动的服务。另外,REST 简单易用,效率高,SOAP 成熟度较高,安全性较好。REST 提供的网络服务叫作OpenAPI,它不只把HTTP 做为传输协议,也做为处理数据的工具,能够说对HTTP 协议作了较好的诠释,充分体现了HTTP 技术的网络能力。目前Google、Amazon、淘宝都有基于REST 的OpenAPI 提供调用。apache
WebService中,JAX-RS 只是将REST 设计应用到Web 服务开发.JAX-RS提供对了REST的支持编程
咱们先看看具体的例子json
一、接口类安全
- <pre class="java" name="code">@Path("/rest_HelloWorld")
- public interface Rest_HelloWorld {
-
-
- @GET
- @Produces (MediaType.TEXT_PLAIN)
- @Path("/say/{name}")
- public String say(@PathParam("name")String name);
-
- @GET
- @Produces (MediaType.TEXT_PLAIN)
- @Path("/sayHello/{name}")
- public String sayHello(@PathParam("user")User user);
-
- @GET
- @Produces ({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML})
- @Path("/getList/{id}")
- public List<User> getList(@PathParam("id")Long id);
-
- }</pre>
-
CXF的Rest使用的JAX-RS规范。JAX-RS: Java API for RESTful Web Services是一个Java编程语言的应用程序接口,支持按照 表象化状态转变 (REST)架构风格建立Web服务Web服务. JAX-RS使用了Java SE 5引入的Java 标注来简化Web服务客户端和服务端的开发和部署。网络
JAX-RS提供了一些标注将一个资源类,一个POJOJava类,封装为Web资源。标注包括:架构
(1)、@Path,标注资源类或方法的相对路径app
(2)、@GET,@PUT,@POST,@DELETE,标注方法是用的HTTP请求的类型
(3)、@Produces,标注返回的MIME媒体类型,( 注解标注,这个注解能够包含一组字符串,默认值是*/*,它指定REST 服务的响应结果的MIME 类型,例如:application/xml、application/json、image/jpeg 等),你 也能够同时返回多种类型,但具体生成结果时使用哪一种格式取决于ContentType。CXF 默认返回的是JSON 字符串。
(4)、 @PathParam,@QueryParam,@HeaderParam,@CookieParam,@MatrixParam,@FormParam, 分别标注方法的参数来自于HTTP请求的不一样位置,例如@PathParam来自于URL的路径,@QueryParam来自于URL的查询参 数,@HeaderParam来自于HTTP请求的头信息,@CookieParam来自于HTTP请求的Cookie。
注意:前两章说的CXF与spring整合及 都是使用JAX-WS规范。JAX-WS规范是一组XML web services的JAVA API。jaxws 是配置SOAP 方式的Web 服务
Spring中引入了两个新的名称空间jaxws、jaxrs,由于CXF 实现了Spring 的NamespaceHandler 接口,实现这个接口能够在Spring 中增长额外的配置。那么jaxws 天然是配置SOAP 方式的Web 服务,你能够看到有jaxws:server、jaxws:endpoint、jaxws:client 三个元素,jaxws:server 和jaxws:endpoint 是等效的,都用于发布Web 服务,出现jaxws:endpoint 的缘由是JAX-WS 规范中使用EndPoint 发布Web 服务(前面使用过这种
方式),CXF 为了和JAX-WS 对应,提供了这个与jaxws:server 功能同样的配置元素;
jaxrs是REST 方式的Web 服务,有jaxrs:server、jaxrs:client 两个元素。
二、接口实现类
- @Service("rest_HelloWorldImpl")
- public class Rest_HelloWorldImpl implements Rest_HelloWorld {
-
- public String say(String name) {
- return name+",您好!";
- }
-
- public String sayHello(User user) {
- return user.getName()+",您好!";
- }
-
- public List<User> getList(Long id){
- List<User> list = new ArrayList<User>();
-
- Long sid=1L;
- User user = new User(sid,"张三"+sid,21);
- list.add(user);
-
- sid=2L;
- user = new User(sid,"张三"+sid,21);
- list.add(user);
-
- sid=3L;
- user = new User(sid,"张三"+sid,21);
- list.add(user);
- return list;
- }
- }
三、CXF在Spring中的配置
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:jaxws="http://cxf.apache.org/jaxws"
- xmlns:jaxrs="http://cxf.apache.org/jaxrs"
- xsi:schemaLocation=" http:
- http:
- http:
- http:
- <import resource="classpath:META-INF/cxf/cxf.xml" />
- <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
- <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
-
-
- <bean id="inMessageInterceptor" class="org.apache.cxf.interceptor.LoggingInInterceptor" />
- <bean id="outMessageInterceptor" class="org.apache.cxf.interceptor.LoggingOutInterceptor"/>
-
- <!--id:名称(随意配),implementor:指定接口具体实现类,address:随意配-->
- <jaxws:endpoint id="helloWorld" implementor="#HelloWorldImpl" address="/HelloWorld" >
- <!-- 输入日志拦截器 -->
- <jaxws:inInterceptors>
- <ref bean="inMessageInterceptor"/>
- </jaxws:inInterceptors>
- <!-- 输出日志拦截器 -->
- <jaxws:outInterceptors>
- <ref bean="outMessageInterceptor"/>
- </jaxws:outInterceptors>
- <jaxws:properties>
- <entry key="mtom_enabled" value="true"></entry>
- </jaxws:properties>
- </jaxws:endpoint>
-
- <jaxrs:server id="rest_HelloWorld" address="/">
- <jaxrs:inInterceptors>
- <ref bean="inMessageInterceptor"/>
- </jaxrs:inInterceptors>
- <jaxrs:outInterceptors>
- <ref bean="outMessageInterceptor"/>
- </jaxrs:outInterceptors>
- <jaxrs:serviceBeans>
- <ref bean="rest_HelloWorldImpl" />
- </jaxrs:serviceBeans>
- <jaxrs:extensionMappings>
- <entry key="json" value="application/json" />
- <entry key="xml" value="application/xml" />
- </jaxrs:extensionMappings>
- <jaxrs:languageMappings>
- <entry key="en" value="en-gb" />
- </jaxrs:languageMappings>
- </jaxrs:server>
-
- <!-- WebService 客户端 spring 配置文件cxf与Spring集成,cxf里提供了一个工厂类org.apache.cxf.jaxws.JaxWsProxyFactoryBean,
- 能够方便实现的调用WebService。serviceClass属性是接口类,address是webService的路径在其余bean里若是要调用webservice,
- 只要将client这个bean注入到须要使用的bean里。-->
- <bean id="client" class="com.exp.service.outer.HelloWorld" factory-bean="clientFactory" factory-method="create" />
- <bean id="clientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
- <property name="serviceClass" value="com.exp.service.outer.HelloWorld" />
- <property name="address" value="http://localhost:8080/demo/webservice/HelloWorld" />
- </bean>
- </beans>
注意:如下代码是新增长代码
xmlns:jaxrs="http://cxf.apache.org/jaxrs"
http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd
- <jaxrs:server id="rest_HelloWorld" address="/">
- <jaxrs:inInterceptors>
- <ref bean="inMessageInterceptor"/>
- </jaxrs:inInterceptors>
- <jaxrs:outInterceptors>
- <ref bean="outMessageInterceptor"/>
- </jaxrs:outInterceptors>
- <jaxrs:serviceBeans>
- <ref bean="rest_HelloWorldImpl" />
- </jaxrs:serviceBeans>
- <jaxrs:extensionMappings>
- <entry key="json" value="application/json" />
- <entry key="xml" value="application/xml" />
- </jaxrs:extensionMappings>
- <jaxrs:languageMappings>
- <entry key="en" value="en-gb" />
- </jaxrs:languageMappings>
- </jaxrs:server>
四、访问
http://localhost:8080/demo/webservice/rest_HelloWorld/getList/1
返回JSON格式: http://localhost:8080/demo/webservice/rest_HelloWorld/getList/1?_type=json
返回XML格式: http://localhost:8080/demo/webservice/rest_HelloWorld/getList/1?_type=xml
获得结果
- <Users>
- <User>
- <id>1</id>
- <name>张三1</name>
- <age>21</age>
- </User>
- <User>
- <id>2</id>
- <name>张三2</name>
- <age>21</age>
- </User>
- <User>
- <id>3</id>
- <name>张三3</name>
- <age>21</age>
- </User>
- </Users>