带有Jersey和Spring的RESTful Web应用程序

几个月前,我们的任务是创建一个API,以向第三方开发人员公开我们系统中的某些功能。 我们选择将这些功能公开为一系列REST Web服务。 我开始使用Jersey ,它是JSR 311 (用于Restful Services的Java API)的参考实现; 事实证明,这是一个很好的惊喜,因为它被证明是极其强大和优雅的。 在本文中,我们将使用Jersey创建一个非常简单的REST Web服务。

这篇文章中使用的示例代码可以在这里找到。

短暂休息
REST (表示状态转移)并不是什么新鲜事物,它是在2000年首次提出的(Fielding, 体系结构样式和基于网络的软件体系结构设计 ),但是今天它仍然未被充分利用,只是在最近几年才真正流行起来。 。 它用于通过URL描述资源,并允许操纵此类资源。 这个想法是利用HTTP协议在客户端和服务器之间创建一个与平台无关的,无状态的,缓存友好的接口。 尽管REST可以应用于其他协议,但目前我们仅关注HTTP。

用更简单的术语来说,诸如“ http://www.myserver.com/files/text.txt”之类的URL描述了一个资源,该资源是一个名为text.txt的文件,位于myserver.com域中。 那里什么都没有 您可以将浏览器指向该文件,浏览器将向服务器发送GET请求以获取该文件。 您甚至不需要编写任何应用程序就能做到这一点。 任何客户端和服务器都将以这种方式进行通信。

其他请求方法变得更加有趣。 每个阅读本文的人都应该熟悉POST方法(通常用于表单)。 在REST应用程序中,发布到URL表示您要编辑该URL上的资源。 不太常用的PUT和DELETE方法分别用于创建和删除资源。 例如,PUT http://www.myserver.com/files/text.txt应该创建一个文本文件,通常包含请求正文的内容。 值得注意的是,在某些系统中,尤其是那些旨在直接与浏览器进行交互的系统,出于某些目的,有时会劫持POST方法,因为某些浏览器对这两种方法的处理不太好。

REST还使用标头来控制缓存或确定客户端期望的内容类型或语言。 毕竟,一个请求是一个普通的旧HTTP请求。 这很不错,很干净,很灵活,并且不会为您提供与SOAP提供相同功能所需的大量管道服务。 在这一点上,我们使用它的原因应该很清楚。

静态资源类的解剖
尽管幕后有很多事情要做,但是Jersey很好地完成了将复杂性隐藏在漂亮的注解背后的工作。 考虑以下:

@Path("/people/{code}")public class Individual {@GET@Produces({"application/json", "application/xml"})public Object find(@PathParam("code") String code) { ... }@DELETEpublic void remove(@PathParam("code") String code) { ... }}

这是一个简单的类,可以根据唯一的代码查找或删除一个人的条目。 第一个批注“路径”指定该类(或方法–如果需要,您可以在方法级别覆盖路径)映射到哪个URL。 在这种情况下,我们要说的是,我们希望此类处理对“ [任何域] /人”的请求; 我们还将期望在“人员”之后有一个值,我们将其视为我们想要的人的唯一代码–就是括号中的值。

我们可以在路径中使用多个变量。 例如,我们可以说“ / team / {team_id} / {position}”或什至“ / team / {team_id} / staff / {position}”来获取填补团队中给定职位的人员的详细信息,取决于我们想要的详细程度。 我们还可以对参数施加限制; 例如,如果我们希望代码为数字值,则可以将其定义为“ {code:[0-9] *}”; 该定义接受正则表达式模式。

GETDELETE批注指定哪个Java方法应该处理哪个HTTP方法。 这些方法还有POST和PUT批注。

PathParam批注从请求URL中获取参数,并将其传递给方法-在这种情况下,它将获取code参数。 到目前为止,不言自明 –甚至还有FormParamHeaderParam版本可以分别从POST表单字段或请求标头中获取值。

我发现Produces注释非常有趣。 批注的参数采用MIME类型的集合,这些类型声明了该方法能够生成的返回类型。 在以上两种情况下,我们都可以提供JSON或XML响应-根据请求的ACCEPT标头的值选择要返回的响应-如果请求接受该方法提供的一种以上返回类型,则第一个返回最好在ACCEPT标头中列出。

归还任何东西
当返回用XmlRootElement注释的类的实例时,Jersey负责确定返回类型,并将该对象转换为所需的表示形式。 不用大惊小怪,不需要音乐。 如果您需要进行一些更高级的格式化(例如,转换为PDF或html页面),那么它应该与编写和注册给定类型的编组器一样简单,尽管我还没有深入研究。

用弹簧接线
当然,该资源类现在正处于适当的位置。 要将其放置在Web应用程序中,我们需要对其进行设置,而Spring将用于此目的。 忍受我 这不是很冗长,一次。

首先,我们需要告诉Spring我们的资源是可配置的组件。 为此,我们只需对类中的Component标注进行排序即可。 然后,我们需要定义范围; 由于REST是无状态的,因此我们将继续使用Scope批注(其值为“ request”)声明一个请求范围。 还没有惊喜! 现在,我们的类声明如下所示:

@Component@Scope("request")@Path("/people/{code}")public class Individual {...}

最后,只需告诉Spring在哪里寻找您的组件即可:

<?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:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><context:component-scan base-package="your.namespace.here" /></beans>

–惊喜–注入注释以填充其字段。 仅此而已...您已经准备好要使用的REST资源。

并非全部
这就是全部。 除了我仍在研究的一些问题外-JAXB在找到循环参考时完全失去了大理石,使某些对象模型难以整理– JSR 311提供了一种将所有这些组合在一起的真正干净的方法。

有一个抱怨。 集合返回类型似乎是一个问题。 可以通过将集合包装在容器中来绕过此操作,但这似乎是不必要的步骤。

样品申请
该示例应用程序可以通过jQuery ajax调用从服务器上的内存映射中列出,加载或删除单个条目。 它已打包在两个WAR文件中(服务器和客户端)。 由于浏览器沙箱,请确保客户端程序包和服务器程序包都在同一域中; 如果您以编程方式连接到服务器,则不存在此限制。

我想我可能已经展示了POST或PUT的示例,但实际上,它足够简单,我真的很讨厌编写表单。

参考: JCG合作伙伴 提供的Jersey和Spring的RESTful Web应用程序   The Simple Part博客中的Karl Agius。


翻译自: https://www.javacodegeeks.com/2012/03/restful-web-applications-with-jersey.html

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

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

相关文章

关于更新pip的心得

如果pip install --upgrade pip 删除了自己&#xff0c;但是无法安装新的自己。 那么下载最新的pip,解压 1、在命令窗口输入 python(前提条件已经在系统路径) setup.py(pip 包里的脚本) install 即可 2、注销一下&#xff0c;让pip在系统路径生效 3、打开cmd&#xff0c;输…

Linux/Unix/Mac 系统GIT密码存储

新建一个 ~/.netrc 文件&#xff0c; 将 git 服务器&#xff0c; 用户名以及密码记录在这个文件&#xff0c; 如下所示&#xff1a; machine your-git-server login your-username password your-password普通用户的 git-server 填 github.com 就可以了. 如果有多个 server 就…

财务部门:你需要多长时间才能够回答老板的这些问题?

企业经营管理中&#xff0c;对管理决策者来说&#xff0c;有许多问题是希望随时都知道的&#xff0c;下面&#xff0c;我们一起来探讨一下&#xff0c;这些常见的问题&#xff0c;我们怎么来快速回答。首先&#xff0c;我们来回答以下几个问题&#xff1a;注&#xff1a;这几个…

yield方法释放锁吗_死磕Synchronized底层实现重量级锁

点击上方“Java知音”&#xff0c;选择“置顶公众号”技术文章第一时间送达&#xff01;作者&#xff1a;farmerjohngit链接&#xff1a;https://github.com/farmerjohngit本文为死磕Synchronized底层实现第四篇文章&#xff0c;内容为重量级锁实现。本系列文章将对HotSpot的sy…

Java应用程序上的Twitter API

是否曾想过将推文附加到Java应用程序&#xff1f; 我为此寻找了最好的API&#xff0c;很幸运&#xff0c;我找到了它&#xff01; http://twitter4j.org/ 一个简单的方法&#xff1a; 我们需要做的第一件事是在您的Twitter帐户中创建一个应用程序&#xff0c;为其授予访问权限…

ps aux和ps -ef命令区别

ps aux 是用BSD的格式来显示 java这个进程显示的项目有&#xff1a;USER,PID,%CPU,%MEM,VSZ,RSS,TTY,STAT,START,TIME,COMMANDps -ef 是用标准的格式显示java这个进程显示的项目有&#xff1a;UID,PID,PPID,C,STIME,TTY,TIME,CMD&#xff09;转载于:https://www.cnblogs.com/ya…

gulp学习笔记3

gulp系列学习笔记&#xff1a; 1、gulp学习笔记1 2、gulp学习笔记2 3、gulp学习笔记3 4、gulp学习笔记4 1、编译sass Sass 是一种 CSS 的开发工具&#xff0c;提供了许多便利的写法&#xff0c;大大节省了开发者的时间&#xff0c;使得 CSS 的开发&#xff0c;变得简单和可维护…

MongoDB学习1——Windows 下配置及启动mongodb服务器

1.下载mongodb程序&#xff1a;http://lt1.cr173.com/soft2/mongodb.zip 2.解压程序3.在解压后的mongodb文件夹中创建 data、logs、conf文件夹4.编写配置文件conf\mongod.conf#端口号 port 12345 #数据库路径&#xff0c;也可以使用绝对路径 dbpath data #日志路径&#xff0…

JavaFX 2.0条形图和散点图(以及JavaFX 2.1 StackedBarCharts)

JavaFX 2.0提供了用于生成图表的内置功能&#xff0c;该功能可在javafx.scene.chart包中找到。 在本文中&#xff0c;我将介绍如何使用JavaFX 2.0创建条形图和散点图 。 在本文的学习过程中&#xff0c;我将一路使用Guava和一些Java 7功能。 在演示JavaFX 2.0图表API之前&#…

python中下划线开头的命名_Python 中各种下划线的骚操作:_、_xx、xx_、__xx、__xx__、_classname_...

我们在定义一些变量或者方法的时候&#xff0c;常常会用到下划线&#xff0c;在 Python 中&#xff0c;下划线可是很有用处的哟&#xff0c;比如变量&#xff0c;有些是一个下划线开头的(_xx)&#xff0c;有些是两个下划线开头的(__xx)&#xff0c;有些是在名称的结尾添加下划线…

MongoDB学习2——Windows 使用mongo连接数据库

一、查看mongo帮助文档mongo.exe --help二、使用mongo 连接服务器mongo.exe 数据库地址&#xff1a;数据库端口号/数据库关闭服务器db.shutdownServer()注&#xff1a;关闭数据必须使用admin数据库权限

【UVA 10816】 Travel in Desert (最小瓶颈树+最短路)

【题意】 有n个绿洲&#xff0c; m条道路&#xff0c;每条路上有一个温度&#xff0c;和一个路程长度&#xff0c;从绿洲s到绿洲t&#xff0c;求一条道路的最高温度尽量小&#xff0c; 如果有多条&#xff0c; 选一条总路程最短的。 InputInput consists of several test cases…

[OJ] Data Stream Median (Hard)

LintCode 81. Data Stream Median (Hard) 思路: 用一个大根堆保存较小的一半数, 一个小根堆保存较大的一半数.每次根据num和两个堆顶的数据决定往哪个堆里面放.放完后进行平衡确保两个堆的size差不超过1.利用两个堆的size和堆顶值计算median.大根堆可以表示为priority_queue<…

书评:JBoss AS 7:配置,部署和管理

我热切地接受Packt Publishing邀请复审JBoss AS 7&#xff1a;配置&#xff0c;部署和管理&#xff0c;因为自从我上次使用JBoss已有数年了&#xff0c;我很想了解有关JBoss AS 7的更多信息。 我已经写过关于《 JBoss AS 7配置&#xff0c;部署和管理》一书的第一印象&#xff…

联想小新air14笔记本黑屏_联想小新air14锐龙版测评,谈谈它的好和坏

联想小新air14锐龙版本测评了解数码就找小侠客&#xff0c;我是机圈小侠客 今天呢&#xff0c;主要和大家测评一下联想小新air14这款笔记本&#xff0c;总体而言的话&#xff0c;这款笔记本它是一个。对于办公人士或者轻度游戏爱好者来说的话&#xff0c;是一个不错的选择&…

MongoDB学习3——mongoDB的一些基本使用

#查看所有数据库show dbs;#创建&#xff08;切换&#xff09;数据库use DATABASE_NAME注&#xff1a;如果数据库不存在&#xff0c;则创建数据库&#xff0c;否则切换到指定数据库。#插入文档&#xff08;关系型数据说法叫插入数据&#xff09;方式一&#xff1a;db.COLLECTION…

Java入门:Java下载与安装方法

本文适合刚入门的Java编程的初学者阅读。 JDK有两种下载方法&#xff0c;一个是官网下载&#xff0c;另一个是第三方网站下载。官网速度也许有点慢&#xff0c;慢的话可以考虑去第三方网站下载。 一、官网下载 1. 访问地址&#xff1a;http://www.oracle.com/cn/downloads/inde…

jquery获得下拉框的值

获取Select &#xff1a; 获取select 选中的 text : $("#ddlRegType").find("option:selected").text(); 获取select选中的 value: $("#ddlRegType ").val(); 获取select选中的索引: $("#ddlRegType ").get(0).selectedIndex; 设置sel…

Java 7:如何编写非常快速的Java代码

当我第一次写此博客时&#xff0c;我的目的是向您介绍ThreadLocalRandom类&#xff0c;它是Java 7中新增的用于生成随机数的类。 我已在一系列微基准测试中分析了ThreadLocalRandom的性能&#xff0c;以了解其在单线程环境中的性能。 结果相对令人惊讶&#xff1a;尽管代码非常…

python 微信支付接口 详解_Python支付接口汇总大全(包含微信、支付宝等,长期更新、欢迎补充)...

wzhifuSDK- 由微信支付SDK 官方PHP Demo移植而来&#xff0c;v3.37下载地址学习Python中有不明白推荐加入交流群号&#xff1a;864573496群里有志同道合的小伙伴&#xff0c;互帮互助&#xff0c;群里有不错的视频学习教程和PDF&#xff01;weixin_pay- 是一个简单的微信支付的…