cxf restful

介绍

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

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

在继续学习如何使用Apache CXF创建基于REST的Web服务之前,我们将了解什么是REST。 REST不是一种技术,当然也不是某种标准。 它只是一种架构风格,它限制了如何以某种方式编写Web服务。 这种样式是由某个Roy Fielding定义的(您猜对了,是的,他是HTTP的架构师之一)在2000年定义。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。 首先,我们需要连接bean.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

cxf restful

cxf restful_使用Apache CXF开发RESTful服务相关推荐

  1. 使用Apache CXF开发RESTful服务

    介绍 如您所知,有两种开发Web服务的方法 简单对象访问协议(SOAP) 代表性状态转移(REST) 在继续学习如何使用Apache CXF创建基于REST的Web服务之前,我们将了解什么是REST. ...

  2. java 利用JAX-RS快速开发RESTful 服务

    JAX-RS(Java API for RESTful Web Services)同样也是JSR的一部分,详细规范定义见 https://jcp.org/en/jsr/detail?id=311 .从 ...

  3. 使用 Struts 2 开发 RESTful 服务

    原文地址:http://www.ibm.com/developerworks/cn/java/j-lo-struts2rest/ REST 简介 REST 是英文 Representational S ...

  4. Apache CXF 简介

    Apache CXF 简介 开放源代码的服务框架 本教程介绍了 Apache CXF 服务框架的基本知识,并通过讲解自带的例子来初步体验通过 CXF 进行服务的发布与消费:然后搭建基于 Eclipse ...

  5. Apache CXF 介绍

    Apache CXF 简介 关于Apache CXF Apache CXF = Celtix + XFire,Apache CXF 的前身叫 Apache CeltiXfire,现在已经正式更名为 A ...

  6. Apache CXF框架简介

    Apache CXF框架是一个开源的Web Services框架,它来源于两个开源项目--ObjectWeb Celtix(ESB产品)和Codehaus XFire(SOAP堆栈软件) Apache ...

  7. Apache CXF入门

    Apache CXF入门 @(WebService)[WebService, CXF,wsdl, soap,uddi] Apache CXF入门 Apache CXF基本概述 Apache CXF框架 ...

  8. cxf springmvc_拥抱模块化Java平台:Java 10上的Apache CXF

    cxf springmvc 自Java 9发布最终将Project Jigsaw交付给大众以来,已经过去了整整一年的时间. 这是一段漫长的旅程,但是在那里,所以发生了什么变化? 这是一个很好的问题,答 ...

  9. java cxf_拥抱模块化Java平台:Java 10上的Apache CXF

    java cxf Java 9版本终于将Project Jigsaw交付给大众已经过去了一年的时间. 这是一段漫长的旅程,但是在那里,所以发生了什么变化? 这是一个很好的问题,答案并不明显和直接. 总 ...

最新文章

  1. ios点击大头针气泡不弹出_地图大头针气泡点击事件
  2. 【解决方案】requests.exceptions.SSLError: HTTPSConnectionPool
  3. jQuery.ajaxPrefilter()函数的使用
  4. css text-align-last设置末尾文本对齐方式
  5. linux动态库与静态库混合连接
  6. css多行文本溢出显示省略号(…)
  7. 08_实现用户邮箱激活
  8. visio2010 java类图_UML图及Visio 2010使用总结
  9. 大数据技术原理与应用学习笔记(九)
  10. 681_python安装win32com模块
  11. 雷达人体存在感应器方案,智能物联网感知技术,实时感应人体存在
  12. java saas 开源框架_(转载)适合SaaS的几种架构比较
  13. 六种复杂控制系统简述:串级、分程、比值、前馈、选择性和三冲量控制
  14. Evernote推出实体笔记本Evernote Business Notebook,支持搜索手写笔记,用实体便签将笔记同步到Evernote上的相应分类
  15. 陀螺仪加速度计MPU6050
  16. 基于React+antd的后台管理模板(可预览)
  17. 通过 Ansible 来操作 Windows 服务器
  18. 硬件加速原理分析探索
  19. Mac电脑下载的google chrome无法使用
  20. 光华股份深交所上市:市值51亿 应收账款余额超5亿

热门文章

  1. Sentinel(四)之工作主流程
  2. <table/>默认适应内容宽度造成滚动条不显示的解决方法
  3. centos7安装最新版node
  4. 《白鹿原》金句摘抄(一)
  5. java面向对象高级分层实例_实体类
  6. 消费端整合SpringCloudGateway
  7. jQuery 表格实现
  8. 2018蓝桥杯省赛---java---C---3(字母阵列)
  9. 2015蓝桥杯省赛---java---B---8(饮料换购)
  10. git 拉取gitlab代码