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.   
  4.   
  5.     @GET   
  6.     @Produces (MediaType.TEXT_PLAIN)   
  7.     @Path("/say/{name}")   
  8.     public String say(@PathParam("name")String name);  
  9.       
  10.     @GET   
  11.     @Produces (MediaType.TEXT_PLAIN)   
  12.     @Path("/sayHello/{name}")   
  13.     public String sayHello(@PathParam("user")User user);  
  14.       
  15.     @GET   
  16.     @Produces ({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML})   
  17.     @Path("/getList/{id}")   
  18.     public List getList(@PathParam("id")Long id);  
  19.       
  20. }
  21.    
 

 

   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.   
  4.     public String say(String name) {  
  5.             return name+",您好!";  
  6.     }  
  7.   
  8.     public String sayHello(User user) {  
  9.         return user.getName()+",您好!";  
  10.     }  
  11.       
  12.     public List getList(Long id){  
  13.         List list = new ArrayList();  
  14.           
  15.         Long sid=1L;  
  16.         User user = new User(sid,"张三"+sid,21);  
  17.         list.add(user);  
  18.           
  19.         sid=2L;  
  20.         user = new User(sid,"张三"+sid,21);  
  21.         list.add(user);  
  22.           
  23.         sid=3L;  
  24.         user = new User(sid,"张三"+sid,21);  
  25.         list.add(user);  
  26.         return list;  
  27.     }  
  28. }  
 

 

3、CXF在Spring中的配置

 

 

Java代码   收藏代码
  1. "1.0" encoding="UTF-8"?>  
  2. "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.       
  14.   
  15.     "inMessageInterceptor" class="org.apache.cxf.interceptor.LoggingInInterceptor" />  
  16.     "outMessageInterceptor" class="org.apache.cxf.interceptor.LoggingOutInterceptor"/>  
  17.   
  18.      
  19.     "helloWorld"  implementor="#HelloWorldImpl" address="/HelloWorld"  >  
  20.           
  21.          
  22.             "inMessageInterceptor"/>  
  23.          
  24.          
  25.          
  26.           "outMessageInterceptor"/>  
  27.          
  28.          
  29.           "mtom_enabled" value="true">  
  30.          
  31.       
  32.       
  33.     "rest_HelloWorld" address="/">  
  34.           
  35.            "inMessageInterceptor"/>  
  36.           
  37.           
  38.             "outMessageInterceptor"/>  
  39.           
  40.           
  41.             "rest_HelloWorldImpl" />  
  42.           
  43.           
  44.             "json" value="application/json" />  
  45.             "xml" value="application/xml" />  
  46.           
  47.           
  48.             "en" value="en-gb" />  
  49.           
  50.       
  51.   
  52.       
  53.     "client" class="com.exp.service.outer.HelloWorld" factory-bean="clientFactory" factory-method="create" />  
  54.     "clientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">  
  55.         "serviceClass" value="com.exp.service.outer.HelloWorld" />  
  56.         "address" value="http://localhost:8080/demo/webservice/HelloWorld" />  
  57.       
  58.   
 

 

 

注意:以下代码是新增加代码

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

 

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

 

 

Java代码   收藏代码
  1. "rest_HelloWorld" address="/">  
  2.           
  3.            "inMessageInterceptor"/>  
  4.           
  5.           
  6.             "outMessageInterceptor"/>  
  7.           
  8.           
  9.             "rest_HelloWorldImpl" />  
  10.           
  11.           
  12.             "json" value="application/json" />  
  13.             "xml" value="application/xml" />  
  14.           
  15.           
  16.             "en" value="en-gb" />  
  17.           
  18.       

 

 

4、访问

    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

 

得到结果

 

Java代码   收藏代码
  1.   
  2.   
  3. 1  
  4. 张三1  
  5. 21  
  6.   
  7.   
  8. 2  
  9. 张三2  
  10. 21  
  11.   
  12.   
  13. 3  
  14. 张三3  
  15. 21  
  16.   
  17.   
 

 

使用CXF的rest还需要额外增加一个Jar:jsr311-api-1.1.1.jar

为了支持返回JSON格式,还需要jettison-1.1.jar


 在这里简单的说下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. class="java" name="code">@Path("/rest_HelloWorld")  
  2. public interface Rest_HelloWorld {  
  3.   
  4.   
  5.     @GET   
  6.     @Produces (MediaType.TEXT_PLAIN)   
  7.     @Path("/say/{name}")   
  8.     public String say(@PathParam("name")String name);  
  9.       
  10.     @GET   
  11.     @Produces (MediaType.TEXT_PLAIN)   
  12.     @Path("/sayHello/{name}")   
  13.     public String sayHello(@PathParam("user")User user);  
  14.       
  15.     @GET   
  16.     @Produces ({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML})   
  17.     @Path("/getList/{id}")   
  18.     public List getList(@PathParam("id")Long id);  
  19.       
  20. }  
  21.    
 

 

   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.   
  4.     public String say(String name) {  
  5.             return name+",您好!";  
  6.     }  
  7.   
  8.     public String sayHello(User user) {  
  9.         return user.getName()+",您好!";  
  10.     }  
  11.       
  12.     public List getList(Long id){  
  13.         List list = new ArrayList();  
  14.           
  15.         Long sid=1L;  
  16.         User user = new User(sid,"张三"+sid,21);  
  17.         list.add(user);  
  18.           
  19.         sid=2L;  
  20.         user = new User(sid,"张三"+sid,21);  
  21.         list.add(user);  
  22.           
  23.         sid=3L;  
  24.         user = new User(sid,"张三"+sid,21);  
  25.         list.add(user);  
  26.         return list;  
  27.     }  
  28. }  
 

 

3、CXF在Spring中的配置

 

 

Java代码   收藏代码
  1. "1.0" encoding="UTF-8"?>  
  2. "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.       
  14.   
  15.     "inMessageInterceptor" class="org.apache.cxf.interceptor.LoggingInInterceptor" />  
  16.     "outMessageInterceptor" class="org.apache.cxf.interceptor.LoggingOutInterceptor"/>  
  17.   
  18.      
  19.     "helloWorld"  implementor="#HelloWorldImpl" address="/HelloWorld"  >  
  20.           
  21.          
  22.             "inMessageInterceptor"/>  
  23.          
  24.          
  25.          
  26.           "outMessageInterceptor"/>  
  27.          
  28.          
  29.           "mtom_enabled" value="true">  
  30.          
  31.       
  32.       
  33.     "rest_HelloWorld" address="/">  
  34.           
  35.            "inMessageInterceptor"/>  
  36.           
  37.           
  38.             "outMessageInterceptor"/>  
  39.           
  40.           
  41.             "rest_HelloWorldImpl" />  
  42.           
  43.           
  44.             "json" value="application/json" />  
  45.             "xml" value="application/xml" />  
  46.           
  47.           
  48.             "en" value="en-gb" />  
  49.           
  50.       
  51.   
  52.       
  53.     "client" class="com.exp.service.outer.HelloWorld" factory-bean="clientFactory" factory-method="create" />  
  54.     "clientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">  
  55.         "serviceClass" value="com.exp.service.outer.HelloWorld" />  
  56.         "address" value="http://localhost:8080/demo/webservice/HelloWorld" />  
  57.       
  58.   
 

 

 

注意:以下代码是新增加代码

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

 

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

 

 

Java代码   收藏代码
  1. "rest_HelloWorld" address="/">  
  2.           
  3.            "inMessageInterceptor"/>  
  4.           
  5.           
  6.             "outMessageInterceptor"/>  
  7.           
  8.           
  9.             "rest_HelloWorldImpl" />  
  10.           
  11.           
  12.             "json" value="application/json" />  
  13.             "xml" value="application/xml" />  
  14.           
  15.           
  16.             "en" value="en-gb" />  
  17.           
  18.       

 

 

4、访问

    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

 

得到结果

 

Java代码   收藏代码
  1.   
  2.   
  3. 1  
  4. 张三1  
  5. 21  
  6.   
  7.   
  8. 2  
  9. 张三2  
  10. 21  
  11.   
  12.   
  13. 3  
  14. 张三3  
  15. 21  
  16.   
  17.   
 

 

使用CXF的rest还需要额外增加一个Jar:jsr311-api-1.1.1.jar

为了支持返回JSON格式,还需要jettison-1.1.jar

你可能感兴趣的:(接口层(webservice))