cxf restful_使用Apache CXF开发RESTful服务

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

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

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

相关文章

linux adc测试程序,基于Qt4.7的ADC测试程序

所使用的开发板&#xff1a;友善之臂tiny6140widget.h#ifndef WIDGET_H#define WIDGET_H#include #include namespace Ui {class Widget;}class TMainForm : public QWidget{Q_OBJECTpublic:TMainForm(QWidget * parent 0, const char * name 0, Qt::WFlags f 0);virtual ~T…

和显卡驱动要配套吗_天天学渲染,你的显卡驱动用对了吗?

大家好&#xff0c;最近一直有很多人和我反馈说&#xff0c;自己在使用Octane或者Redshift渲染器渲染的时候经常容易崩溃&#xff0c;甚至是闪退了&#xff0c;其实这个问题有很大一部分原因是由于你的显卡驱动没用对导致的。接下来就和大家说下如何解决。首先我们大部分人买了…

网络研讨会:Java 9的第一印象–构建可伸缩企业应用程序的新方法

在此网络研讨会上听我们对新Java版本的一些初步想法 Java 9的新版本引起了很多炒作。在Mark Reinhold领导的专门团队的带领下&#xff0c;将Java平台迁移到模块花费了近十年的辛苦工作。 除了备受期待的Project Jigsaw&#xff0c;此版本还包含许多其他令人兴奋的功能。 现在是…

linux cat 文本颜色,linux文本文件查看、展示命令 :cat head tail grep more less nl

linux文本文件查看、显示命令 :cat head tail grep more less nllinux文本文件查看、显示命令 :cat head tail grep more less nl1、cat 显示文件内容命令。命令格式&#xff1a;#cat [[选项]] 常用选项:-b,计算所有非空输出行&#xff0c;开始行编号为1。-n&#xff0c;计算…

noj数据结构稀疏矩阵的加法十字链表_一个算法毁了一款好游戏?算法和数据结构到底有多重要?...

来源 | 异步前段时间大火的国产游戏——《太吾绘卷》&#xff0c;由于创新的玩法和精良的制作一度广受好评&#xff0c;然而随着玩家游戏的深入和时长的积累&#xff0c;发现该游戏在玩的过程中游戏外的问题很多很多。首先是存档速度慢&#xff0c;然后是密集的计算导致功耗大量…

arm-linux-gcc libstdc .so.6,mini2440编译内核:usr/lib/libstdc++.so.6 not found

买了块mini2440开发板&#xff0c;按照光盘中的mini2440用户手册编译内核时&#xff0c;#make zImage出现错误&#xff1a;usr/lib/libstdc.so.6 not found&#xff0c;在网上百度了下&#xff0c;有很多不同的解决办法&#xff0c;我试了一个&#xff0c;编译成功 ^ ^注&#…

前端实现可绘制的canvas画布_前端图形学基础(五)——Canvas状态管理

点击右上角的关注&#xff0c;不定期前端干货分享&#xff01;&#xff01;欢迎来到我的前端图形学系列文章&#xff1a;前端图形学基础(一)——Canvas基础入门前端图形学基础(二)——Canvas基础前端图形学基础(三)——Canvas绘制图片前端图形学基础(四)——Canvas绘制曲线我们…

sudo su su_Spring Security应用程序中的su和sudo

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

linux如何判断同名进程个数,Linux下判断是否存在多个同名进程

Linux 下如何判断同名进程的个数&#xff0c;这个可以通过shell命令ps -e | grep -c "所查进程名字"&#xff0c;就可以得到进程的个数。这里给出代码实现。bool processNumber(char *name){FILE *fptr;bool bret false;char cmd[255] {\0};char buf[255] {\0};sp…

having和where可以同时使用吗_阴、阳离子聚丙烯酰胺可以同时混合溶解使用吗?...

聚丙烯酰胺是一种水处理药剂&#xff0c;需要溶解在水中制成浓度为0.1%-0.5%的聚丙烯酰胺水溶液。一般来说&#xff0c;当聚丙烯酰胺实际使用时&#xff0c;阴离子聚丙烯酰胺和阳离子聚丙烯酰胺可以同时使用。但是&#xff0c;阳离子聚丙烯酰胺和阴离子聚丙烯酰胺不能混合在一起…

Lombok,AutoValue和Immutables,或如何编写更少,更好的代码返回

在上一篇有关Lombok库的文章中 &#xff0c;我描述了一个库&#xff0c;该库有助于处理Java中的样板代码&#xff08; 是的&#xff0c;我知道这些问题已经在Kotlin中解决了 &#xff0c;但这是现实生活&#xff0c;我们不能一味地坐下来&#xff0c;一旦出现较新或更简单的语言…

noj大作业c语言扫雷,noj大作业.doc

作业名称&#xff1a;算法演示程序学 院&#xff1a;航海学院班 级&#xff1a;学 号&#xff1a;2013300951姓 名&#xff1a;苏和团队组成&#xff1a;西北工业大学2015年11月11日1、问题与背景(描述程序所要解决的问题或应用背景)C语言经过几十年的发展已经发展出多种多样的…

福州PHP讲师招聘_“艺”起就业|招聘信息汇总

亲爱的美术学院毕业生们在全国上下万众一心抗击新冠肺炎疫情的关键时期学院党委高度重视并时刻关注着每一位毕业生的就业工作为进一步做好疫情防控工作也为进一步确保同学们顺利求职就业保障毕业生就业工作的时效性学院公众号特别设立“艺”起就业—招聘信息发布栏目 由院学工…

哪个app最费电_关于石墨烯养生地暖,业主最关心的几大问题,答案附上!

很多人对石墨烯地暖有些许误解&#xff0c;不敢轻易接受。其实不然&#xff0c;石墨烯地暖是一种供热效果好、安全性高、运用寿命长、节能环保的新型健康采暖方式&#xff0c;不仅适用于住宅小区、别墅等家庭采暖&#xff0c;也可用于办公楼、医院等各类公共建筑采暖。在众多对…

双机之间的串行通信设计 c语言编程,双机串行通信设计精品.doc-资源下载人人文库网...

双机串行通信设计 精品.doc所属课程名称 单片机原理与接口技术 题 目 双机串行通信 二 总体设计2.1 设计目的 通过本次课题设计&#xff0c;应用单片机原理及其接口技术等所学相关知识及查阅资料&#xff0c;完成简易双机串行通信设计&#xff0c;以达到理论与实践更好的结合、…

cpu 抖动_微抖动,繁忙的等待和绑定CPU

cpu 抖动性能分析新机器 当我在新机器上工作时&#xff0c;我想了解它的局限性。 在这篇文章中&#xff0c;我将研究机器的抖动以及忙于等待本周末构建的新PC的影响。 该机器的规格很有趣&#xff0c;但不是发布目的。 永远不要少于它们&#xff1a; i7-3970X六核运行于4.5 GH…

南京邮电大学通达学院c语言实验报告,南京邮电大学通达学院c语言程序报告.docx...

南京邮电大学通达学院c语言程序报告南京邮电大学通达学院程序设计(上机)报告题 目&#xff1a; R015M P008E专 业 学 生 姓 名 班 级 学 号 指 导 教 师 日 期 2015年5月评 分 细 则评分项优秀良好中等及格不及格遵守机房规章制度上机表现学习态度基础知识水平程序设计能力课题…

两端分散对齐怎么设置_Word文字很难对齐?用这4个方法,2秒可对齐所有文字!...

日常工作中&#xff0c;我们在给Word文档进行对齐操作的时候&#xff0c;很多人都是猛敲空格键来对齐文字&#xff0c;通常是一顿操作猛如虎&#xff0c;仔细一看原地杵。简单的文字对齐&#xff0c;这种方法可能还算凑效&#xff0c;但稍显复杂的就不那么管用了。今天叨叨君就…

怎样学c++程序语言,如何学好 C++——学习门槛最高的编程语言

根据InfoQ 编程语言 2 月排行榜&#xff0c;统计发现&#xff0c;学习门槛最高的编程语言是 C。那么如何学好这门又难、门槛又高的语言呢&#xff1f;前面我们介绍过C。C是一种面向对象的计算机程序设计语言&#xff0c;由美国AT&T贝尔实验室的本贾尼斯特劳斯特卢普博士在2…

首个JDK 10(18.3)发行候选版(内部版本43)展示了新的版本控制方案

Mark Reinhold的帖子“ JDK 10&#xff1a;First Release Candidate ”宣布“内部版本43中没有未解决的P1错误”&#xff0c;并将Build 43命名为最初的JDK 10版本候选 。 Reinhold帖子还指向“ JDK 10 Early Access Builds ”页面&#xff0c;该页面包含发行说明的链接。 到基于…