`
yufenfei
  • 浏览: 803021 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

CXF之三(REST风格的支持)

 
阅读更多

 

 在这里简单的说下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、接口类

 

 

@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、接口实现类

 

 

@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中的配置

 

 

<?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

 

 

<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、访问

    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>
 

 

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

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

分享到:
评论
8 楼 yadongliang 2018-01-08  
楼主,我的地址栏http://localhost:8080/pers/ws/rest/customerInfo2/selectByPrimaryKey/100000030058这样查出来的结果是xml格式的,然鹅加上?_type=json这样浏览器提示:
No message body writer has been found for class com.pers.model.CustomerInfo2, ContentType: application/json
什么情况啊
7 楼 wangyudong 2017-11-27  
由CXF实现的微服务需要有比较好的工具去测试RESTful API,很多REST Client是不支持自动化测试RESTful API,也不支持自动生成API文档.
之前习惯用一款名字为 WisdomTool REST Client,支持自动化测试RESTful API,输出精美的测试报告,并且自动生成精美的RESTful API文档。
轻量级的工具,功能却很精悍哦!

https://github.com/wisdomtool/rest-client

Most of REST Client tools do not support automated testing.

Once used a tool called WisdomTool REST Client supports automated testing, output exquisite report, and automatically generating RESTful API document.

Lightweight tool with very powerful features!

https://github.com/wisdomtool/rest-client
6 楼 leo_soul 2015-08-27  
亲,你没写客户端吧?只见配置没见client的demo。
而且,id="client" class="com.exp.service.outer.HelloWorld",这已经指定了类,为何下边clientFactory的serviceClass又指定一次?这俩是不是一个是工厂,一个是实现?应该是不同的class吧?
另外,重新排排版吧,有点乱。
5 楼 qixiangyangyes 2015-03-06  
    谢谢  分享 呵呵
4 楼 yufenfei 2015-01-05  
jianghao_weiyi 写道
在哪抄的

兄弟,淡定!只是一个笔记,写个简单demo还不至于去抄,如果你需要源码可以发给你
3 楼 jianghao_weiyi 2014-10-08  
在哪抄的
2 楼 ageha67 2014-03-19  
照着这么配置,提示出错 Caused by: org.xml.sax.SAXParseException; lineNumber: 14; columnNumber: 72; cvc-complex-type.2.4.c: 通配符的匹配很全面, 但无法找到元素 'jaxrs:client' 的声明。
1 楼 tjmljw 2014-01-13  

相关推荐

    cxf开发rest风格接口jar

    【标题】"CXF开发REST风格接口所需的最小JAR包" 在Java开发中,Apache CXF是一个广泛使用的开源服务框架,它支持Web服务(SOAP)和RESTful接口的创建。REST(Representational State Transfer)风格的接口已经成为...

    java cxf规范rest

    【标题】"java cxf规范rest"涉及到的是Java开发中使用Apache CXF框架实现RESTful服务的相关技术。CXF是一个开源的服务框架,它允许开发者创建和消费各种Web服务,包括基于JAX-WS和JAX-RS的标准。REST...

    spring cxf rest demo

    【Spring CXF REST Demo】项目是一个使用Maven构建的Java应用程序,它展示了如何将Spring框架与Apache CXF集成,以创建RESTful风格的服务。在这个项目中,开发者可以学习到如何利用CXF作为服务端的REST服务提供者,...

    CXF搭建的RESTful风格的webservice

    Apache CXF是一个流行的开源框架,它提供了强大的支持来构建RESTful Web服务。下面将详细讲解如何使用CXF搭建RESTful风格的Web服务。 1. **CXF简介** Apache CXF是一个全面的服务开发框架,它允许开发者创建和部署...

    Apache CXF + Spring3 + REST + JSON配置

    REST(Representational State Transfer)是一种网络应用程序的设计风格和开发方式,常用于构建现代Web服务。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析...

    Spring CXF Restful 实例

    REST(Representational State Transfer)是一种软件架构风格,常用于构建现代Web服务,强调简洁、无状态和基于标准的接口设计。 首先,让我们了解REST的基本原则。RESTful API通常基于HTTP协议,通过GET、POST、...

    使用CXF暴露您的REST服务

    Apache CXF是一个开源项目,提供了全面的服务框架,支持多种协议,如SOAP、XML-RPC、REST等。它拥有强大的数据绑定和转换功能,支持JAXB、JSON、XMLBeans等多种数据格式。 #### 三、搭建REST服务环境 为了更好地...

    cxf rest webservice

    CXF提供了强大的支持来创建RESTful Web服务,使得开发人员能够方便地实现文件下载功能。 【描述】:“CXF REST Web服务实现文件下载” 在CXF中实现RESTful Web服务进行文件下载,主要涉及到以下几个关键步骤: 1....

    cxf+spring发布webservice和restservice

    CXF同样支持REST服务的开发,你可以使用JAX-RS(Java API for RESTful Web Services)规范来实现。例如,通过使用@Path、@GET、@POST等注解,你可以指定资源路径、HTTP方法以及处理这些请求的方法。 为了将CXF与...

    CXF restful风格WebService

    Apache CXF不仅支持传统的SOAP Web服务,也支持RESTful风格的服务。使用CXF开发RESTful服务,我们可以利用JAX-RS(Java API for RESTful Web Services)规范,它是Java平台上的RESTful服务开发标准。 **三、CXF与...

    SPRING-MVC-MQ-CXF-REST_Demo

    "SPRING-MVC-MQ-CXF-REST_Demo"这个项目很可能是用来演示如何在同一个应用中整合Spring MVC、MQ、CXF和REST技术。项目可能包含了以下部分: 1. Spring MVC配置:展示了如何设置DispatcherServlet、视图解析器以及...

    Web Service 那点事儿(4)—— 使用 CXF 开发 REST 服务 - ImportNew1

    它支持多种协议和服务风格,包括 SOAP 和 REST。在本篇中,我们将探讨如何使用 CXF 开发 RESTful Web 服务,以及如何与 Spring 框架集成。 **RESTful Web 服务基础** REST(Representational State Transfer)是一...

    采用(rest ,hession,cxf)几种技术实现webservice

    在本文中,我们将探讨三种常用的技术:REST、Hessian和CXF,它们都可以用来实现Web服务,尤其是当我们使用Maven作为构建工具时。 首先,REST(Representational State Transfer,表述性状态转移)是一种基于HTTP...

    cxf的jar包

    2. **RESTful支持**:CXF也支持REST(Representational State Transfer)风格的Web服务。通过JAX-RS(Java API for RESTful Web Services)规范,开发者可以轻松地创建资源驱动的API。 3. **互操作性**:CXF致力于...

    在同一个系统里用cxf 实现SOAP 协议和RESTful风格 两种类型的webservice接口

    它支持SOAP、RESTful等多种Web服务规范,使得开发者能够灵活地选择适合项目需求的服务风格。CXF提供了丰富的API和工具,简化了Web服务的开发过程。 首先,我们来看SOAP协议。SOAP是一种基于XML的消息传递协议,用于...

    使用CXF构建webservice和rest应用

    4. **RESTful服务**:CXF同样支持RESTful风格的服务,通过JAX-RS(Java API for RESTful Web Services)规范。开发者可以通过简单的注解来定义资源类和方法,从而创建REST API。 5. **服务部署与测试**:讲述如何将...

    Spring整合CXF,发布RSETful 风格WebService

    对于RESTful风格的Web服务,CXF提供了一种称为JAX-RS(Java API for RESTful Web Services)的API支持。JAX-RS定义了如何在Java类和方法上使用注解来声明资源路径、HTTP方法和消息体。在CXF中,我们可以使用`@Path`...

    CXF-3.1.11jar包

    2. **RESTful服务**:除了传统的SOAP服务,CXF也支持Representational State Transfer(REST)风格的应用程序开发,这使得开发更加轻量级和灵活。 3. **JAX-RS集成**:CXF提供了对Java API for RESTful Web ...

    CXF2.2.3完整架包

    2. **SOAP与REST支持**:CXF可以处理SOAP消息,同时支持RESTful风格的服务,这意味着你可以构建既支持SOAP又支持REST的应用程序,提供了灵活性。 3. **数据绑定**:CXF支持JAXB(Java Architecture for XML Binding...

    CXF

    除了传统的SOAP服务,CXF也支持RESTful风格的服务。使用CXF,开发者可以轻松地创建符合REST原则的HTTP服务,支持JSON和XML等多种数据格式。CXF的JAX-RS(Java API for RESTful Web Services)实现使得REST服务的开发...

Global site tag (gtag.js) - Google Analytics