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();
}
}
<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格式
输出如下: