CXF Restful 服务端编程

来源:互联网 发布:车牌照识别 c语言 编辑:程序博客网 时间:2024/06/06 09:46

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格式


输出如下:






0 0
原创粉丝点击