应用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); } }
可以在控制台成功地得到满意的输出:
这次的入门实例顺利实现喽 : )
相关文章推荐
- 用cxf开发restful风格的WebService
- CXF+MyEclipse 开发webservice入门实例之HelloWorld
- 使用CXF开发RestFul风格WebService
- CXF+MyEclipse 开发webservice入门实例之HelloWorld
- RestFul(一)WebService之CXF的RestFul风格开发
- Spring+CXF开发RESTful风格的WebService
- 基于Spring4.X和Hibernate4.x开发Restful风格WebService
- Spring 入门实例 简易登录系统(精通Spring+4.x++企业应用开发实战 学习笔记一)
- CXF+Spring+Hibernate实现RESTful webservice服务端实例
- CXF 开发RESTful WebService服务(Spring+JPA服务端,JAXRS2.0+WebClient客户端)
- 开发基于CXF的 RESTful WebService web 项目 webservice发布
- 使用python创建一个简单的restful风格的webservice应用
- 在同一个系统里用cxf 实现SOAP 协议和RESTful风格 两种类型的webservice接口(含简单demo)
- WebService学习入门(SOAP协议,ApacheCXF入门,基于CXF技术开发CRM服务器)
- 根据第三方提供的wsdl报文(axis2开发),进行的webservice应用的开发实例
- webservice入门实例,CXF方式
- maven+cxf编写RESTful风格webservice
- 使用cxf,spring,mybatis框架完成restful风格的webservice服务
- 使用cxf开发webservice应用时抛出异常
- DB2数据库 Java应用开发快速入门实例