应用CXF开发RESTful风格的WebService入门实例

1 篇文章 0 订阅
1 篇文章 0 订阅

前言

在此篇RESTful风格Web Service应用构建实例中,我将采用Apache CXF作为JAX-RS的实现。

项目描述

环境配置

注意:有件较奇葩的事,在我们即将开始的实例中,会用到高频出现的 org.apache.cxf.jaxrs.client.WebClient,而最新版(截止2017.7.19为apahe-cxf-3.1.12)的CXFjar包集内这个的所需jar包 cxf-rt-rs-client-x.x.x.jar竟然没有的,请到常见的Maven仓库中获取相同版本的该jar包 : )

创建并发布Web Service

  1. 创建一个Java Project(并不需要是Dynamic Web Project,因为CXF内含Jetty的使用),并命名,比如CalcJAXRSCXF
  2. 引入相关jar(图中为构建我们的项目所需的最精简的jar列表)并构建项目结构如下图所示:
    structure

  3. 完成CalcREST类如下:

package com.jaxrscxf.calc;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("/calc")
public class CalcREST {

    @GET
    @Path("/add/{a}/{b}")
    @Produces(MediaType.TEXT_PLAIN)
    public String addPlainText(@PathParam("a") double a, @PathParam("b") double b) {
        return (a + b) + "";
    }

    @GET
    @Path("/add/{a}/{b}")
    @Produces(MediaType.TEXT_XML)
    public String add(@PathParam("a") double a, @PathParam("b") double b) {
        return "<?xml version=\"1.0\"?>" + "<result>" +  (a + b) + "</result>";
    }

    @GET
    @Path("/sub/{a}/{b}")
    @Produces(MediaType.TEXT_PLAIN)
    public String subPlainText(@PathParam("a") double a, @PathParam("b") double b) {
        return (a - b) + "";
    }

    @GET
    @Path("/sub/{a}/{b}")
    @Produces(MediaType.TEXT_XML)
    public String sub(@PathParam("a") double a, @PathParam("b") double b) {
        return "<?xml version=\"1.0\"?>" + "<result>" +  (a - b) + "</result>";
    }
}

其中:
- @Path标签标注的类为root源类,@Path(“/calc”)即将路径设置为base URL+/calc,base URL中包含host、port等等
- @Path标签同样可以用在root源类的方法上,方便常用方法的成组和再使用
- 为了从URL中提取参数,使用URL路径模版,即以”{ }”包含的变量
- @GET标签标注将对HTTP GET请求进行相应的方法上
- @Produces标签标注具体的MIME媒体类别,其资源可以产生并发送回Client端
4. 现在我们来创建一个HTTP的Server用来发布Web Service并接收请求。完成CalcRESTStartUp类如下:

package com.jaxrscxf.calc;

import org.apache.cxf.endpoint.Server;
import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;

public class CalcRESTStartUp {

    public static void main(String[] args) {
         JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean();
            sf.setResourceClasses(CalcREST.class);
            sf.setResourceProvider(CalcREST.class, 
                new SingletonResourceProvider(new CalcREST()));
            sf.setAddress("http://localhost:9999/calcrest/");
            Server server = sf.create();

            // destroy the server
            // uncomment when you want to close/destroy it
            // server.destroy();

    }
}

我们使用CXF提供的JAXRSServerFactoryBean来辅助快速的创建服务器的endpoints,注意确保9999端口号此刻没有被其他应用占用,如有需要可以随意换成更特殊的端口号喽
5. 右键CalcRESTStartUp->Run As->Java Application开启我们创建好的Server
6. 来测试一下成果喽,打开浏览器,输入RESTful风格的请求,可获得对应的XML形式计算结果:

http://localhost:9999/calcrest/calc/add/20/30/

output

http://localhost:9999/calcrest/calc/sub/20/30/

output
太酷了!

创建RESTful Web Service客户端

完成CalcRESTClient类如下:

package com.jaxrscxf.calc.client;

import org.apache.cxf.jaxrs.client.WebClient;

public class CalcRESTClient {
    static final String REST_URI = "http://localhost:9999/calcrest/";
    static final String ADD_PATH = "calc/add";
    static final String SUB_PATH = "calc/sub";
    static final String MUL_PATH = "calc/mul";
    static final String DIV_PATH = "calc/div";

    public static void main(String[] args) {
        int a = 122;
        int b = 34;
        String s = "";

        WebClient plainAddClient = WebClient.create(REST_URI);
        plainAddClient.path(ADD_PATH).path(a + "/" + b).accept("text/plain");
        s = plainAddClient.get(String.class);
        System.out.println(s);

        WebClient xmlAddClient = WebClient.create(REST_URI);
        xmlAddClient.path(ADD_PATH).path(a + "/" + b).accept("text/xml");
        s = xmlAddClient.get(String.class);
        System.out.println(s);

        WebClient plainSubClient = WebClient.create(REST_URI);
        plainSubClient.path(SUB_PATH).path(a + "/" + b).accept("text/plain");
        s = plainSubClient.get(String.class);
        System.out.println(s);

        WebClient xmlSubClient = WebClient.create(REST_URI);
        xmlSubClient.path(SUB_PATH).path(a + "/" + b).accept("text/xml");
        s = xmlSubClient.get(String.class);
        System.out.println(s);
    }
}

可以在控制台成功地得到满意的输出:
output

这次的入门实例顺利实现喽 : )

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值