CXF Restful 服务端编程

本文详细介绍了如何使用Apache CXF结合Spring创建Restful服务。通过资源类、@Path标签、参数注解以及@Produces和@Consumes标签,展示了如何构建和交互REST服务。示例包括GET和POST请求的处理,以及不同媒体类型的响应。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Apache CXF 是一个开源的 Services 框架,继承了 Celtix 和 XFire 两大开源项目的精华,提供了对 JAX-WS 全面的支持

Spring与CXF集成

Spring 提供了灵活的依赖注入机制(DI),实现了 IoC (Inversion of Control 控制反转)。用户可顺利接入以前的业务逻辑,并将它们发布成 Restful 的服务。

1、资源类

资源分为根资源和子资源。根资源至少使用一个 @Path 标签。本次实验的CustomerService就为一个根资源类,服务端可以有多个根资源类,例如新建一个Hello.java, 具有SayHello() 远程服务

package demo.jaxrs.server;

import javax.ws.rs.Consumes;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;

@Path("/helloservice/")
@Produces("text/html")
public class Hello {
	@GET
	@Path("/{username}/")
	@Consumes("text/plain")
	@Produces("text/plain")
	public String sayHello(@PathParam("username") String userName) {
	        return "hello " + userName;
	}
	
	@GET
	@Path("/{username}/girlfriend")
	@Produces("text/plain")
	public String girlFriend(@PathParam("username") String userName, @QueryParam("")Customer user) {
	        return "hello " + userName + ": your's gf is " + user.getName();
	}
	
	@POST
	@Path("/{username}/girlfriend")
	@Produces("text/plain")
	public String girlFriendPost(@PathParam("username") String userName,
	                @FormParam("") Customer user ) {
	        return "hello " + userName + ": your's gf is " + user.getName();
	}
}



注:修改beans.xml文件,注入资源类

<jaxrs:server id="customerService" address="/service1">
        <jaxrs:serviceBeans>
                <ref bean="customerBean" />
                <ref bean="helloBean" />
        </jaxrs:serviceBeans>
        <!-- 引入json 输入/输出支持 -->
        <jaxrs:providers>
                <bean class="org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider"/>
                <bean class="org.apache.cxf.jaxrs.provider.JAXBElementProvider"/>
        </jaxrs:providers>
  </jaxrs:server>

  <bean id="customerBean" class="demo.jaxrs.server.CustomerService" />
  <bean id="helloBean" class="demo.jaxrs.server.Hello" />



2、@Path标签

@Path(“/helloservice/”)表示 根URI 路径,其他的远程服务前的@Path标签代表相对URI路径,如@Path("/{username}/")

@PathParam 就是从 @path 中用 {} 模板抽取的变量。

1). 在浏览器输入 http://localhost:8080/service1/helloservice/sysu  运行结果如下:


其中,"service1" 表示的是服务器address, 这个是在beans.xml中设置的,"helloservice"代表根URI,"sysu"作为参数,

{} 模板将其抽取赋给"username",因此远程服务中"userName"参数的值就为"sysu"


还有其他参数注解标签:@QueryParam 就是从 QueryString 或 Form 中的变量。@FormParam 从 POST 的表单中获取参数。

2). 在浏览器输入 http://localhost:8080/service1/helloservice/sysu/girlfriend?id=123&name=hn 运行结果如下:


该请求调用Hello的第二个服务,"sysu/girlfriend" 作为远程服务的URI,"id=123&name=hn" 属于QueryString ,系统自动将其转化成Customer类,传给远程服务的"user"参数,因此服务器会返回上述文本


3). 使用curl工具,向服务器发送POST请求


原理与@QueryParam类似,只不过是通过POST方法,参数在后面输入


2、@Produces  @Consumes  标签
     @Produces用于指定输出格式,参数可以是字符串数组。@Consumes指定处理输入媒体的类型,作用方式与@Produces类似

     5种媒体类型:

text/plain 纯文本
text/html  网页
application/json JSON格式
application/xml XML格式
application/javascript 脚本

     实验案例访问  http://localhost:8080/service1/customerservice/customers/123, 会输出xml格式的文本,但是修改@produce标签可以支持Json格式


输出如下:






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值