您的位置:首页 > 其它

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

2017-07-19 22:48 633 查看

前言

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

项目描述

在这个示例中,我们将创建一个Java实现的简单的Calculator类,其操作是“add”和“subtract”。

将这些作为RESTful Web Service公开,接受HTTP GET请求,并将响应以XML或纯文本形式发送。

可以在http://localhost:9999/calcrest/calc/add/http://localhost:9999/calcrest/calc/sub/访问该Web Service

在URI本身中发送参数。 例如,要做20和30的加法,URI是http://localhost:9999/calcrest/calc/add/20/30

并创建一个Web Service客户端,它向上述的URI发送HTTP GET请求,并显示响应(即调用的Web Service的计算结果)

环境配置

Java SE 6 及以上

Eclipse IDE

CXF相关jar包 Apache官方下载地址

注意:有件较奇葩的事,在我们即将开始的实例中,会用到高频出现的
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

创建一个Java Project(并不需要是Dynamic Web Project,因为CXF内含Jetty的使用),并命名,比如
CalcJAXRSCXF


引入相关jar(图中为构建我们的项目所需的最精简的jar列表)并构建项目结构如下图所示:



完成
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/




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




太酷了!

创建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);
}
}


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



这次的入门实例顺利实现喽 : )
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  RESTful web-service CXF