使用Apache CXF开发RESTful服务

介绍

如您所知,有两种开发Web服务的方法

  1. 简单对象访问协议(SOAP)
  2. 代表性状态转移(REST)

在继续学习如何使用Apache CXF创建基于REST的Web服务之前,我们将了解什么是REST。 REST不是一项技术,当然也不是某种标准。 这只是一种架构风格,它限制了如何以某种方式编写Web服务。 这种样式是由某个Roy Fielding在2000年定义的(您猜对了,是的,他是HTTP的架构师之一)。REST体系结构的主要主角是资源 ,可以由统一资源标识符或URI 。 在任何给定时间点资源的状态由文件表示,称为资源的表示 。 客户端可以通过将表示形式与请求一起传送来更新资源状态。 现在,新的表示形式将与响应一起返回给客户端。 该表示形式包含资源接受的html,xml,JSON等格式的信息。 遵守REST体系结构规则的资源称为RESTfull资源,遵守此规则的Web服务称为RESTfull Web服务。

创建一个项目以包含您的Web服务

我通常使用maven Strut2入门原型在struts2 + spring中进行Web开发,以创建我的Web项目。 要在我的项目中使用CXF,我将以下依赖项添加到我的POM中

<dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-frontend-jaxws</artifactId><version>${cxf.version}</version>
</dependency>
<dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-transports-http</artifactId><version>${cxf.version}</version>
</dependency>
<dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-transports-http-jetty</artifactId><version>${cxf.version}</version>
</dependency>

非maven用户可以在以下链接中找到要添加的依赖项的详细信息: http : //cxf.apache.org/docs/using-cxf-with-maven.html 。 可以从此处直接下载CXF: http : //cxf.apache.org/download.html

如何创建CXF RESTfull Web服务?

假设您想使用CXF创建RESTfull Web服务来管理个人书架中的书。 您通常需要在书架上执行以下操作

  1. 新增书籍
  2. 更新书籍信息
  3. 从书架上删除一本书
  4. 拿书
  5. 获取图书清单
  6. 按作者姓名获取图书清单

需要执行以下步骤来创建这样的服务

  1. 创建BookVO,BookList(值对象)以在请求和响应中作为表示形式传递。
  2. 将对象与请求和响应绑定。
  3. 创建服务实现类以接受请求并生成响应。
  4. 使用CXF容器注册您的Web服务。
  5. 在Web容器中部署服务。
  6. 创建客户端以调用服务上的方法。

获取本教程的源代码

我已经在SVN中提交了本教程的源文件。

  • 您可以从以下网站下载该Web应用程序: http : //subversion.assembla.com/svn/weblog4j/Weblog4jDemo/trunk
  • 您可以从以下 网址 下载客户端: http : //subversion.assembla.com/svn/weblog4j/DemoClient/trunk

注意:这两个都是ItelliJ maven项目,因此您可以将它们直接导入到intelliJ IDE或手动将文件复制到其他IDE

创建BookVO(值对象)以在请求和响应中作为表示形式传递。

BookVO类

package com.aranin.weblog4j.vo;import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import java.io.Serializable;@XmlRootElement(name="Book")
public class BookVO implements Serializable{private long bookId;
private String bookName;
private String author;public long getBookId() {
return bookId;
}public void setBookId(long bucketId) {
this.bookId = bookId;
}public String getBookName() {
return bookName;
}public void setBookName(String bookName) {
this.bookName = bookName;
}public String getAuthor() {
return author;
}public void setAuthor(String author) {
this.author = author;
}
}

图书清单类

package com.aranin.weblog4j.vo;import javax.xml.bind.annotation.XmlRootElement;
import java.util.ArrayList;
import java.util.List;@XmlRootElement(name="BookList")
public class BookList {
private List<BookVO> bookList;public List<BookVO> getBookList() {
if(bookList == null){
bookList = new ArrayList<BookVO>();
}
return bookList;
}public void setBookList(List<BookVO> bookList) {
this.bookList = bookList;
}
}

将数据对象(即BookVO)与请求和响应绑定

要将BookVO与请求或响应绑定,需要将其序列化为XML或JSON流。 序列化需要使用数据绑定组件之一来完成。 CXF使用JAXB作为默认数据绑定组件。 JaXB使用@XmlRootElement批注将数据对象映射到xml。 您可以在上面的代码中看到XmlRootElement批注的使用。

创建服务实现类以接受请求并生成响应

让我们看看CXF RestFull Web服务的外观。 我们将创建一个BookService类,该类将对BookSelf执行添加,更新,删除和获取操作。

BookService类别

package com.aranin.weblog4j.services.rest;import com.aranin.weblog4j.hashdb.HashDB;
import com.aranin.weblog4j.vo.BookVO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import javax.ws.rs.*;
import javax.ws.rs.core.Response;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;/*** Created by IntelliJ IDEA.* User: Niraj Singh* Date: 3/13/13* Time: 3:58 PM* To change this template use File | Settings | File Templates.*/
public class BookService {protected final Logger log = LoggerFactory.getLogger(BookService.class);@POST@Path("/getbook/{name}")@Produces({"application/xml","application/json"})@Consumes({"application/xml","application/json","application/x-www-form-urlencoded"})public Response getBucket(@PathParam("name") String name) {log.debug("name : " + name);BookVO bookVO = null;try {bookVO = HashDB.getBook(URLDecoder.decode(name, "UTF-8"));} catch (UnsupportedEncodingException e) {e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.}if(bookVO == null){return Response.status(Response.Status.BAD_REQUEST).build();}else{return Response.ok(bookVO).build();}}@POST@Path("/addbook")@Produces({"application/xml","application/json"})@Consumes({"application/xml","application/json","application/x-www-form-urlencoded"})public Response addBook(@FormParam("name") String bookName,@FormParam("author") String author) {log.debug("inside addBook");BookVO bookVO = new BookVO();bookVO.setBookName(bookName);bookVO.setAuthor(author);HashDB.insertBook(bookVO);if(HashDB.getBook(bookName) == null){return Response.status(Response.Status.BAD_REQUEST).build();}else{return Response.ok(bookVO).build();}}
}

您可以在BookService类的getBook和addBook中看到两个方法。 它们是获取和添加书籍的服务方法。 其余的更新删除等方法可以用相同的方式编写。 现在,让我们看看各种注释和方法调用的含义。

  • @POST –表示服务仅接收POST请求。
  • @Path –这是Web服务的路径。 因此,可以使用以下URL <base_url> / bookservice / getbook / {name}进行获取,使用<base_url> / bookservice / addbook进行添加来调用Web服务。
  • @Produces –指示生成的响应的MIME类型。 在我们的例子中,它既是application / xml也是application / json。
  • @Consumes –指示此服务可以使用的请求的MIME类型。

使用CXF容器注册您的Web服务。

CXF的一件很酷的事情是,它使用基于Spring的配置来注册其Web服务端点,因此让我们在WEB-INF中创建beans.xml并在web.xml中配置CXF。 首先,我们需要连接beans.xml以通过spring容器加载。

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/beans.xml,/WEB-INF/applicationContext.xml</param-value>
</context-param>

其次,将注册CXFServlet加载到web.xml中。

<servlet>
<servlet-name>CXFServlet</servlet-name>
<display-name>CXF Servlet</display-name>
<servlet-class>
org.apache.cxf.transport.servlet.CXFServlet
</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet><servlet-mapping>
<servlet-name>CXFServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>

现在打开bean.xml并注册bookservice端点。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:jaxws="http://cxf.apache.org/jaxws"xmlns:jaxrs="http://cxf.apache.org/jaxrs"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://cxf.apache.org/jaxrshttp://cxf.apache.org/schemas/jaxrs.xsdhttp://cxf.apache.org/jaxwshttp://cxf.apache.org/schemas/jaxws.xsd"><import resource="classpath:META-INF/cxf/cxf.xml" /><import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" /><import resource="classpath:META-INF/cxf/cxf-servlet.xml" /><jaxws:endpointid="bookShelfService"implementor="com.aranin.weblog4j.services.BookShelfServiceImpl"address="/bookshelfservice" /><bean id="bookserviceclass" class="com.aranin.weblog4j.services.rest.BookService"/><jaxrs:server id="bookservice" address="/bookservice"><jaxrs:serviceBeans><ref bean="bookserviceclass" /></jaxrs:serviceBeans></jaxrs:server></beans>

现在您的Web服务已准备就绪。 构建您的Web应用程序并将其部署在任何servlet容器中。

为您的Web服务创建客户端

可以通过多种方式创建客户端,我已经使用apache Http Components编写了客户端。 这些库可以在http://hc.apache.org/httpclient-3.x/中找到。

Maven用户可以使用以下命令拉动Http组件jar

<dependency>
<groupId>commons-httpclient</groupId>
<artifactId>commons-httpclient</artifactId>
<version>3.1</version>
</dependency><dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.1.3</version>
<scope>compile</scope>
</dependency><dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
<version>4.1.3</version>
<scope>compile</scope>
</dependency>

现在调用Web服务,我创建了一个名为DemoRestClient的util类。

package com.aranin.weblog4j.client;import com.aranin.weblog4j.vo.BookVO;
import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.PostMethod;import java.net.URLEncoder;/*** Created by IntelliJ IDEA.* User: Niraj Singh* Date: 3/13/13* Time: 4:15 PM* To change this template use File | Settings | File Templates.*/
public class DemoRestClient {public static void main(String[] args){DemoRestClient restClient = new DemoRestClient();try {//restClient.addBook("Naked Sun", "Issac Asimov");restClient.getBook("Naked Sun");} catch (Exception e) {e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.}}public BookVO getBook(String bookName) throws Exception {String output = null;try{String url = "http://localhost:8080/weblog4jdemo/bookservice/getbook/";url = url + URLEncoder.encode(bookName, "UTF-8");HttpClient client = new HttpClient();PostMethod mPost = new PostMethod(url);client.executeMethod( mPost );Header mtHeader = new Header();mtHeader.setName("content-type");mtHeader.setValue("application/x-www-form-urlencoded");mtHeader.setName("accept");mtHeader.setValue("application/xml");mPost.addRequestHeader(mtHeader);client.executeMethod(mPost);output = mPost.getResponseBodyAsString( );mPost.releaseConnection( );System.out.println("out : " + output);}catch(Exception e){throw new Exception("Exception in retriving group page info : " + e);}return null;}public void addBook(String bookName, String author) throws Exception {String output = null;try{String url = "http://localhost:8080/weblog4jdemo/bookservice/addbook";HttpClient client = new HttpClient();PostMethod mPost = new PostMethod(url);mPost.addParameter("name", "Naked Sun");mPost.addParameter("author", "Issac Asimov");Header mtHeader = new Header();mtHeader.setName("content-type");mtHeader.setValue("application/x-www-form-urlencoded");mtHeader.setName("accept");mtHeader.setValue("application/xml");//mtHeader.setValue("application/json");mPost.addRequestHeader(mtHeader);client.executeMethod(mPost);output = mPost.getResponseBodyAsString( );mPost.releaseConnection( );System.out.println("output : " + output);}catch(Exception e){throw new Exception("Exception in adding bucket : " + e);}}}

运行此客户端以查看Web服务的输出。 现在,它将发送xmloutput,因为响应接受标头为“ application / xml”。 您可以将其更改为application / json以获得json输出。

多数民众赞成。 这是使用apache CXF开发RestFull Web服务的非常基本的介绍,还有很多要探索的内容。 愉快的探索,直到那再见。 如果您阅读了此文章,请留下一些评论,以使我不断受到启发。

参考: Weblog4j博客上的JCG合作伙伴 Niraj Singh 使用Apache CXF开发RESTful服务 。

翻译自: https://www.javacodegeeks.com/2013/07/developing-restful-services-using-apache-cxf.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/367675.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CTU 2017 J - Punching Power (二分图匹配)

题意&#xff1a; 公园管理层最终决定在公园的各个战略位置安装一些流行的拳击机。实际上&#xff0c;为了弥补以前缺少的机器&#xff0c;他们决定安装尽可能多的机器。令人惊讶的是&#xff0c;公园不会被新机器堵塞&#xff0c;因为对于机器的位置存在一些非常严重的法律限制…

UI设计师必知:link和@import引用css文件方法的区别

<link>元素所参考的样式用户可以自由的选择加以改变&#xff0c;而导入的样式表单就自动的与剩下的样式表融合在一起了CSS与HTML文档结合的4中方法&#xff1a;1 使用<link>元素链接到外部的样式文件2 在<head>元素中使用"style"元素来指定3 使用C…

javascript mqtt 发布订阅消息

js client使用paho-mqtt&#xff0c;官网地址&#xff1a;http://www.eclipse.org/paho/&#xff0c;参考http://www.eclipse.org/paho/clients/js/官网给出例子Getting Started&#xff0c;写出下面简单的测试代码。 <!DOCTYPE html> <html> <head> <met…

linux java jar war_简单介绍Java 的JAR包、EAR包、WAR包区别

WAR包WAR(Web Archive file)网络应用程序文件&#xff0c;是与平台无关的文件格式&#xff0c;它允许将许多文件组合成一个压缩文件。War专用于Web方面。大部分的JAVA WEB工程&#xff0c;都是打成WAR包进行发布的。War是一个web模块&#xff0c;其中需要包括WEB-INF&#xff0…

Spring Web应用程序的最大缺陷

在其应用程序中使用Spring Framework的开发人员很好地谈论了依赖注入的好处。 不幸的是&#xff0c;他们并不是很好地利用它的好处&#xff0c;例如单一负责的原则和在应用程序中关注点的分离 。 如果我们看一下任何基于Spring的Web应用程序&#xff0c;很可能会通过使用以下常…

用C++调用tensorflow在python下训练好的模型(centos7)

本文主要参考博客https://blog.csdn.net/luoyexuge/article/details/80399265 [1] bazel安装参考:https://blog.csdn.net/luoyi131420/article/details/78585989 [2] 首先介绍下自己的环境是centos7&#xff0c;tensorflow版本是1.7&#xff0c;python是3.6&#xff08;anacond…

纯CSS实现圆角边框

HTML部分&#xff1a;<body><div> <b class”t1″></b> <b class”t2″></b> <b class”t3″></b> <b class”t4″></b> <div class”cont”>这边输入实际内容</div> <b clas…

ActiveMQ producer同步/异步发送消息

http://activemq.apache.org/async-sends.html producer发送消息有同步和异步两种模式&#xff0c;可以通过代码配置&#xff1a; ((ActiveMQConnection)connection).setUseAsyncSend(true); producer默认是异步发送消息。在没有开启事务的情况下&#xff0c;producer发送持久化…

Java Priority Queue(PriorityQueue)示例

我们知道&#xff0c; 队列如下&#xff1a;F irst- 我正˚First-UT模型&#xff0c;但有时我们需要处理的基础上&#xff0c;优先级队列中的对象。 例如&#xff0c;假设我们有一个应用程序可以为日常交易生成股票报告&#xff0c;并处理大量数据并花费时间来处理它。 因此&am…

css未知尺寸的图片的水平和垂直居中

纯CSS实现未知尺寸的图片水平和垂直居中.box { /*非IE的主流浏览器识别的垂直居中的方法*/ display: table-cell; vertical-align:middle; /*设置水平居中*/ text-align:center; /* 针对IE的Hack */ *display: block; *font-size:26…

heap 的一些用法

noip 合并果子 #include<bits/stdc.h> using namespace std; int heap[maxn]; int size0; void input(int d) {heap[size]d;push_heap(heap,heapsize,greater<int>()); } int get() {pop_heap(heap,heapsize,greater<int>());//pop_heap(heap,heapsize);ret…

java 反射 new class_Java高级特性-反射:不写死在代码,还怎么 new 对象?

反射是 Java 的一个高级特性&#xff0c;大量用在各种开源框架上。在开源框架中&#xff0c;往往以同一套算法&#xff0c;来应对不同的数据结构。比如&#xff0c;Spring 的依赖注入&#xff0c;我们不用自己 new 对象了&#xff0c;这工作交给 Spring 去做。然而&#xff0c;…

EF Core利用Scaffold从根据数据库生成代码

在EF6 之前的时代&#xff0c;如果需要从数据库中生成代码&#xff0c;是可以直接在界面上操作的&#xff0c;而到了EF Core的时代&#xff0c;操作方式又有更简便的方式了&#xff0c;我们只需要记住以下这条指令。 Scaffold-DbContext "Server服务器地址;Database数据库…

如何通过CSS开启硬件加速来提高网站性能

你知道我们可以在浏览器中用css开启硬件加速&#xff0c;使GPU (Graphics Processing Unit) 发挥功能&#xff0c;从而提升性能吗&#xff1f; 现在大多数电脑的显卡都支持硬件加速。鉴于此&#xff0c;我们可以发挥GPU的力量&#xff0c;从而使我们的网站或应用表现的更为流畅…

Spring Security应用程序中的su和sudo

很久以前&#xff0c;我从事的项目具有很强大的功能。 有两个角色&#xff1a;用户和主管。 主管可以以任何方式更改系统中的任何文档&#xff0c;而用户则更受工作流约束的限制。 当普通用户对当前正在编辑和存储在HTTP会话中的文档有疑问时&#xff0c;主管可以介入&#xff…

示例介绍:JavaFX 8打印

我有一段时间没有写博客了&#xff0c;我想与其他人分享有关JavaFX的所有信息&#xff08;我的日常工作和家庭可能是借口&#xff09;。 对于那些是本博客的新手&#xff0c;我是JavaFX 2 Introduction by Example&#xff08;JIBE&#xff09;的作者&#xff0c; Java 7 Recip…

placeholder的使用

1.定义 placeholder 属性提供可描述输入字段预期值的提示信息 该提示会在输入字段为空时显示&#xff0c;并会在字段获得焦点时消失。 注释&#xff1a;placeholder 属性适用于以下的 <input> 类型&#xff1a;text, search, url, telephone, email 以及 password。 2.用…

字符串练习

字符串练习&#xff1a; http://news.gzcc.cn/html/2017/xiaoyuanxinwen_1027/8443.html 取得校园新闻的编号 trhttp://news.gzcc.cn/html/2017/xiaoyuanxinwen_1027/8443.html print(a[-14:-5])https://docs.python.org/3/library/turtle.html 产生python文档的网址 trhttps:/…

CSS清除行内元素之间的HTML空白

至今我还记得年轻是在IE6上开发的那些苦逼日子,特别希望IE浏览器采用 inline-block 的显示方式.行内块(inline-block)是非常有用的,特别是想要不用block和float来控制这些行内元素的margin,padding之时。问题来了,HTML源码中行内元素之间的空白有时候显示在屏幕上那是相当的讨厌…

int64 java_为什么json 不能使用 int64类型

json 简介jsON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集 。 JSON采用完全独立于语言的文本格式&#xff0…