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程式碼- @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);
- }
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程式碼- @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;
- }
- }
3、CXF在Spring中的配置
Java程式碼- <?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://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans.xsd
- http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
- http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd">
- <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
Java程式碼- <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>
4、訪問
得到結果
Java程式碼- <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>
使用CXF的rest還需要額外增加一個Jar:jsr311-api-1.1.1.jar