1. 程式人生 > >Rest風格的web服務開發-入門篇1

Rest風格的web服務開發-入門篇1

 在這裡簡單的說下CXF對REST的支援,先對REST概念說下。

REST 是一種軟體架構模式,只是一種風格,不是像SOAP 那樣本身承載著一種訊息協議,也可以叫做REST 是基於HTTP協議的軟體架構。

    REST 中重要的兩個概念就是資源定位和資源操作,而HTTP 協議恰好完整的提供了這兩個要點,HTTP 協議中的URI 可以完成資源定位,GET、POST、OPTION等方法可以完成資源操作,因此REST 完全依賴HTTP 協議就可以完成Web 服務,而不像SOAP 協議那樣只利用HTTP 的傳輸特性,定位與操作由SOAP 協議自身完成,也正是由於SOAP 訊息的存在,使得SOAP 笨重。你也可以說REST 充分利用了HTTP 協議的特性,而不是像SOAP 那樣只利用了其傳輸這一特性(事實上大多數人提到HTTP 協議就只會想到它能用於資料傳輸)。

REST 是一種軟體架構理念,現在被移植到Web 服務上(因此不要提到REST 就馬上想到WebService,JAX-RS 只是將REST 設計風格應用到Web 服務開發),那麼在開發Web 服務上,偏於面向資源的服務適用於REST,偏於面向活動的服務。另外,REST 簡單易用,效率高,SOAP 成熟度較高,安全性較好。REST 提供的網路服務叫做OpenAPI,它不僅把HTTP 作為傳輸協議,也作為處理資料的工具,可以說對HTTP 協議做了較好的詮釋,充分體現了HTTP 技術的網路能力。目前Google、Amazon、淘寶都有基於REST 的OpenAPI 提供呼叫。

      WebService中,JAX-RS 只是將REST 設計應用到Web 服務開發.JAX-RS提供對了REST的支援

我們先看看具體的例子

1、介面類

Java程式碼  收藏程式碼
  1. @Path("/rest_HelloWorld")  
  2. public interface Rest_HelloWorld {  
  3.     @GET   
  4.     @Produces (MediaType.TEXT_PLAIN)   
  5.     @Path("/say/{name}")   
  6.     public String say(@PathParam("name")String name);  
  7.     @GET   
  8.     @Produces (MediaType.TEXT_PLAIN)   
  9.     @Path("/sayHello/{name}")   
  10.     public String sayHello(@PathParam("user")User user);  
  11.     @GET   
  12.     @Produces ({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML})   
  13.     @Path("/getList/{id}")   
  14.     public List<User> getList(@PathParam("id")Long id);  
  15. }

   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,標註資源類或方法的相對路徑

(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 兩個元素。

2、介面實現類

Java程式碼  收藏程式碼
  1. @Service("rest_HelloWorldImpl")  
  2. public class Rest_HelloWorldImpl implements Rest_HelloWorld {  
  3.     public String say(String name) {  
  4.             return name+",您好!";  
  5.     }  
  6.     public String sayHello(User user) {  
  7.         return user.getName()+",您好!";  
  8.     }  
  9.     public List<User> getList(Long id){  
  10.         List<User> list = new ArrayList<User>();  
  11.         Long sid=1L;  
  12.         User user = new User(sid,"張三"+sid,21);  
  13.         list.add(user);  
  14.         sid=2L;  
  15.         user = new User(sid,"張三"+sid,21);  
  16.         list.add(user);  
  17.         sid=3L;  
  18.         user = new User(sid,"張三"+sid,21);  
  19.         list.add(user);  
  20.         return list;  
  21.     }  
  22. }  

3、CXF在Spring中的配置

Java程式碼  收藏程式碼
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xmlns:jaxws="http://cxf.apache.org/jaxws"  
  5.     xmlns:jaxrs="http://cxf.apache.org/jaxrs"  
  6.     xsi:schemaLocation=" http://www.springframework.org/schema/beans                       
  7.                     http://www.springframework.org/schema/beans/spring-beans.xsd                         
  8.                     http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd  
  9.                     http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd">  
  10.     <import resource="classpath:META-INF/cxf/cxf.xml" />  
  11.     <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />  
  12.     <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />  
  13.     <bean id="inMessageInterceptor" class="org.apache.cxf.interceptor.LoggingInInterceptor" />  
  14.     <bean id="outMessageInterceptor" class="org.apache.cxf.interceptor.LoggingOutInterceptor"/>  
  15.    <!--id:名稱(隨意配),implementor:指定介面具體實現類,address:隨意配-->  
  16.     <jaxws:endpoint id="helloWorld"  implementor="#HelloWorldImpl" address="/HelloWorld"  >  
  17.         <!-- 輸入日誌攔截器 -->  
  18.        <jaxws:inInterceptors>  
  19.             <ref bean="inMessageInterceptor"/>  
  20.        </jaxws:inInterceptors>  
  21.        <!-- 輸出日誌攔截器 -->  
  22.        <jaxws:outInterceptors>  
  23.           <ref bean="outMessageInterceptor"/>  
  24.        </jaxws:outInterceptors>  
  25.        <jaxws:properties>  
  26.           <entry key="mtom_enabled" value="true"></entry>  
  27.        </jaxws:properties>  
  28.     </jaxws:endpoint>  
  29.     <jaxrs:server id="rest_HelloWorld" address="/">  
  30.         <jaxrs:inInterceptors>  
  31.            <ref bean="inMessageInterceptor"/>  
  32.         </jaxrs:inInterceptors>  
  33.         <jaxrs:outInterceptors>  
  34.             <ref bean="outMessageInterceptor"/>  
  35.         </jaxrs:outInterceptors>  
  36.         <jaxrs:serviceBeans>  
  37.             <ref bean="rest_HelloWorldImpl" />  
  38.         </jaxrs:serviceBeans>  
  39.         <jaxrs:extensionMappings>  
  40.             <entry key="json" value="application/json" />  
  41.             <entry key="xml" value="application/xml" />  
  42.         </jaxrs:extensionMappings>  
  43.         <jaxrs:languageMappings>  
  44.             <entry key="en" value="en-gb" />  
  45.         </jaxrs:languageMappings>  
  46.     </jaxrs:server>  
  47.     <!-- WebService 客戶端 spring 配置檔案cxf與Spring整合,cxf裡提供了一個工廠類org.apache.cxf.jaxws.JaxWsProxyFactoryBean,  
  48.     可以方便實現的呼叫WebService。serviceClass屬性是介面類,address是webService的路徑在其他bean裡如果要呼叫webservice,  
  49.     只要將client這個bean注入到需要使用的bean裡。-->  
  50.     <bean id="client" class="com.exp.service.outer.HelloWorld" factory-bean="clientFactory" factory-method="create" />  
  51.     <bean id="clientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">  
  52.         <property name="serviceClass" value="com.exp.service.outer.HelloWorld" />  
  53.         <property name="address" value="http://localhost:8080/demo/webservice/HelloWorld" />  
  54.     </bean>  
  55. </beans>  

注意:以下程式碼是新增加程式碼

      xmlns:jaxrs="http://cxf.apache.org/jaxrs"

       http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd

Java程式碼  收藏程式碼
  1. <jaxrs:server id="rest_HelloWorld" address="/">  
  2.         <jaxrs:inInterceptors>  
  3.            <ref bean="inMessageInterceptor"/>  
  4.         </jaxrs:inInterceptors>  
  5.         <jaxrs:outInterceptors>  
  6.             <ref bean="outMessageInterceptor"/>  
  7.         </jaxrs:outInterceptors>  
  8.         <jaxrs:serviceBeans>  
  9.             <ref bean="rest_HelloWorldImpl" />  
  10.         </jaxrs:serviceBeans>  
  11.         <jaxrs:extensionMappings>  
  12.             <entry key="json" value="application/json" />  
  13.             <entry key="xml" value="application/xml" />  
  14.         </jaxrs:extensionMappings>  
  15.         <jaxrs:languageMappings>  
  16.             <entry key="en" value="en-gb" />  
  17.         </jaxrs:languageMappings>  
  18.     </jaxrs:server>  

4、訪問

得到結果

Java程式碼  收藏程式碼
  1. <Users>  
  2. <User>  
  3. <id>1</id>  
  4. <name>張三1</name>  
  5. <age>21</age>  
  6. </User>  
  7. <User>  
  8. <id>2</id>  
  9. <name>張三2</name>  
  10. <age>21</age>  
  11. </User>  
  12. <User>  
  13. <id>3</id>  
  14. <name>張三3</name>  
  15. <age>21</age>  
  16. </User>  
  17. </Users>  

使用CXF的rest還需要額外增加一個Jar:jsr311-api-1.1.1.jar