在這裏簡單的說下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>