java调用wadl_Java中的WADL:温和的介绍

java调用wadl

WADL( Web应用程序描述语言 )对REST而言,WSDL对SOAP而言。 这种语言的存在引起了很多争议(请参阅: 我们需要WADL吗? 或者 需要 WADL还是不需要WADL )。 我可以想到使用WADL的一些合法用例,但是如果您已经在这里,则可能不打算再进行讨论。 因此,让我们继续前进到WADL本身。

原则上,WADL与WSDL类似,但是语言的结构有很大不同。 尽管WSDL定义了消耗或产生其中一些消息和操作的平面列表,但WADL强调了RESTful Web服务的分层性质。 在REST中,主要工件是资源。 每个资源(名词)都表示为URI。 每个资源都可以定义CRUD操作(动词,作为HTTP方法实现)和嵌套资源。 嵌套资源与父资源有很强的关系,通常代表所有权。

一个简单的示例是表示书籍列表的http://example.com/api/books资源。 您可以(HTTP)获取此资源,这意味着检索整个列表。 您还可以获取http://example.com/api/books/7资源,以在books资源中获取第7本书的详细信息。 或者,您甚至可以使用相同的URI放入新版本或完全删除资源。 您不仅限于单一的嵌套层次:获取http://example.com/api/books/7/reviews?page=2&size=10将会检索第二本书(最多10本书)的第二页(最多10条)。 显然,您也可以在书籍旁边放置其他资源,例如http://example.com/api/readers

就像WSDL人员能够做到的那样,要求正式而精确地描述每个可用资源,方法,请求和响应。 WADL是描述“可用URI”的选项之一,尽管有些人认为编写良好的REST服务应该是自我描述的(请参阅HATEOAS )。 但是,这是一个简单的空WADL文档:

<application xmlns="http://wadl.dev.java.net/2009/02"><resources base="http://example.com/api"/>
</application>

这里没什么好看的。 请注意, <resources>标记定义了基本API地址。 我们将要添加的所有命名资源都相对于该地址。 您还可以定义几个<resources>标记来描述多个API。 因此,让我们添加一个简单的资源:

<application xmlns="http://wadl.dev.java.net/2009/02"><resources base="http://example.com/api"><resource path="books"><method name="GET"/><method name="POST"/></resource></resources>
</application>

这可以通过两种可能的方法在http://example.com/api/books下定义资源:GET用于检索整个列表,而POST用于创建(添加)新项目。 根据您的要求,您可能还希望允许DELETE方法(删除所有项目),WADL负责记录允许的内容。

在开始时还记得我们的示例: / books / 7吗? 显然7只是一个示例,我们不会在WADL中声明所有可能的书ID。 而是有一个方便的占位符语法:

<application xmlns="http://wadl.dev.java.net/2009/02"><resources base="http://example.com/api"><resource path="books"><method name="GET"/><resource path="{bookId}"><param required="true" style="template" name="bookId"/><method name="GET"/></resource></resource></resources>
</application>

您应注意两个重要方面:首先,使用{ bookId }占位符代替嵌套资源。 其次,为了清楚起见,我们正在使用< param />标签记录该占位符。 我们很快将看到如何将其与方法结合使用。 为了确保您仍然与我在一起,上面的文档介绍了GET / booksGET / books / some_id资源。

<application xmlns="http://wadl.dev.java.net/2009/02"><resources base="http://example.com/api"><resource path="books"><method name="GET"/><resource path="{bookId}"><param required="true" style="template" name="bookId"/><method name="GET"/><method name="DELETE"/><resource path="reviews"><method name="GET"><request><param name="page" required="false" default="1" style="query"/><param name="size" required="false" default="20" style="query"/></request></method></resource></resource></resource><resource path="readers"><method name="GET"/></resource></resources>
</application>

Web服务变得越来越复杂,但是它描述了很多操作。 首先GET / books / 42 / reviews是有效的操作。 但是有趣的部分是嵌套的<request />标记。 如您所见,我们可以独立描述每种方法的参数。 在我们的案例中,定义了可选的查询参数(与之前用于URI占位符的模板参数相反)。 这为客户端提供了有关可接受的页面和大小查询参数的其他知识。 这意味着/ books / 7 / reviews?page = 2&size = 10是有效的资源标识符。 我是否提到过每个资源,方法和参数都可以按照WADL规范附加文档?

我们将在这里停止,仅提及WADL的其余部分。 首先,到目前为止,您可能已经猜到了,每个<method />都有一个<response />子标记。 请求和响应都可以定义请求或响应必须遵循的确切语法(例如,在XML Schema中)。 该响应还可以记录可能的HTTP响应代码。 但是,由于我们将使用到目前为止在代码优先应用程序中获得的知识,因此我特意留下了<grammars />定义。 WADL是敏捷的,它使您可以定义所需的最少(或尽可能多)信息。

因此,我们知道了WADL的基础知识,现在我们想使用它,可以作为基于Java的应用程序的使用者或生产者。 幸运的是,该语言本身有一个wadl.xsd XML Schema描述,我们可以使用它来生成可使用JAXB注释的POJO(使用JDK中的xjc工具):

$ wget http://www.w3.org/Submission/wadl/wadl.xsd
$ xjc wadl.xsd

在那里...挂了! 软件开发人员的生活充满挑战和非凡的问题。 有时,这只是一个令人讨厌的网络过滤器,可疑数据包(连同您半个小时的生命)消失了。 一旦您回想起2008年左右写的文章: W3C的DTD流量过大 ,就不难发现问题了:

<xs:import namespace="http://www.w3.org/XML/1998/namespace"schemaLocation="http://www.w3.org/2001/xml.xsd"/>

从浏览器访问xml.xsd会立即返回HTML页面,但xjc工具将永远等待。 在本地下载此文件并更正wadl.xsd中schemaLocation属性有助于。 总是小事……

$ xjc wadl.xsd 
parsing a schema... 
compiling a schema... 
net/java/dev/wadl/_2009/_02/Application.java 
net/java/dev/wadl/_2009/_02/Doc.java 
net/java/dev/wadl/_2009/_02/Grammars.java 
net/java/dev/wadl/_2009/_02/HTTPMethods.java 
net/java/dev/wadl/_2009/_02/Include.java 
net/java/dev/wadl/_2009/_02/Link.java 
net/java/dev/wadl/_2009/_02/Method.java 
net/java/dev/wadl/_2009/_02/ObjectFactory.java 
net/java/dev/wadl/_2009/_02/Option.java 
net/java/dev/wadl/_2009/_02/Param.java 
net/java/dev/wadl/_2009/_02/ParamStyle.java 
net/java/dev/wadl/_2009/_02/Representation.java 
net/java/dev/wadl/_2009/_02/Request.java 
net/java/dev/wadl/_2009/_02/Resource.java 
net/java/dev/wadl/_2009/_02/ResourceType.java 
net/java/dev/wadl/_2009/_02/Resources.java 
net/java/dev/wadl/_2009/_02/Response.java 
net/java/dev/wadl/_2009/_02/package-info.java

由于我们将在基于Maven的项目中使用这些类(并且我讨厌将生成的类提交至源存储库),因此让我们将xjc执行移至maven生命周期:

<plugin><groupId>org.codehaus.mojo</groupId><artifactId>jaxb2-maven-plugin</artifactId><version>1.3</version><dependencies><dependency><groupId>net.java.dev.jaxb2-commons</groupId><artifactId>jaxb-fluent-api</artifactId><version>2.0.1</version><exclusions><exclusion><groupId>com.sun.xml</groupId><artifactId>jaxb-xjc</artifactId></exclusion></exclusions></dependency></dependencies><executions><execution><goals><goal>xjc</goal></goals></execution></executions><configuration><arguments>-Xfluent-api</arguments><bindingFiles>bindings.xjb</bindingFiles><packageName>net.java.dev.wadl</packageName></configuration>
</plugin>

嗯, pom.xml并不是有史以来最简洁的格式……没关系,在每次编译之前,它将在编译源代码之前生成WADL XML类。 我还喜欢通顺-API插件, 与*()与普通制定者一起的方法增加了回允许链接。 很方便 最后,我们为生成的工件定义更合适的包名称(如果您发现net.java.dev.wadl._2009._02足够好的包名称,则可以跳过此步骤),并将Wadl前缀添加到所有生成的类bindings.xjb文件中:

<jxb:bindings version="1.0"xmlns:jxb="http://java.sun.com/xml/ns/jaxb"xmlns:xs="http://www.w3.org/2001/XMLSchema"xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"jxb:extensionBindingPrefixes="xjc"><jxb:bindings schemaLocation="../xsd/wadl.xsd" node="/xs:schema"><jxb:schemaBindings><jxb:nameXmlTransform><jxb:typeName prefix="Wadl"/><jxb:anonymousTypeName prefix="Wadl"/><jxb:elementName prefix="Wadl"/></jxb:nameXmlTransform></jxb:schemaBindings></jxb:bindings></jxb:bindings>

现在,我们准备使用JAXB和POJO类以XML格式生成和使用WADL。 有了这些知识和基础,我们就可以开发一些有趣的库了,这将是下一篇文章的主题。

参考:我们的JCG合作伙伴 Tomasz Nurkiewicz在Java和社区博客上对WADL(Java)的简要介绍


翻译自: https://www.javacodegeeks.com/2012/01/wadl-in-java-gentle-introduction.html

java调用wadl

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

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

相关文章

Js的 继承

Js 和 Java , C等语言不是很一样 . 其他语言有 类和实例 但是Js就比较特殊 , 所以 类和实例 只能说是大多数面向对象编程的语言的基本概念 . Js比较特殊 , 它不去分类和实例的概念 . 而是通过原型(prototype)来实现面向对象编程 . 下面介绍Js中第一种用于继承的方法 var rob…

php 伪静态 500错误,Apache开启伪静态后报500错误.

出自:http://blog.163.com/lgh_2002/blog/static/44017526201051452939761/检查APACHE日志发现如下信息&#xff1a;Request exceeded the limit of 10 internal redirects due to probable configuration error. Use ‘LimitInternalRecursion’ to increase the limit if nec…

onhashchange

1 <!DOCTYPE html>2 <html lang"en">3 <head>4 <meta charset"UTF-8">5 <title>Document</title>6 </head>7 <body>8 <input type"button" value"随机" id"btn1…

mysql+yes数据类型,怎样修改mysql列的数据类型?

修改字段(列)数据类型修改字段的数据类型就是把字段的数据类型转换成另一种数据类型。在 MySQL 中修改字段数据类型的语法规则如下&#xff1a;ALTER TABLE MODIFY 其中&#xff1a;表名&#xff1a;指要修改数据类型的字段所在表的名称&#xff1b;字段名&#xff1a;指需要修…

Redis分片

本文是我们学院课程的一部分&#xff0c;标题为Redis NoSQL键值存储 。 这是Redis的速成班。 您将学习如何安装Redis并启动服务器。 此外&#xff0c;您将在Redis命令行中乱七八糟。 接下来是更高级的主题&#xff0c;例如复制&#xff0c;分片和集群&#xff0c;同时还介绍了…

Openstack入坑指南

什么是云计算 概念 云计算是一种基于互联网的计算方式&#xff0c;通过这种方式&#xff0c;共享的软硬件资源和信息&#xff0c;可以按需求提供给计算机和其他设备。用户不需要了解”云“中的基础设施细节&#xff0c;不必具有相应的专业知识&#xff0c;也无需直接控制。云计…

Akka型演员:探索接收器模式

在上一篇文章中&#xff0c;我们研究了Akka Typed提供的一些基本功能。 在本文和下一篇文章中&#xff0c;我们将更进一步地了解一些其他功能&#xff0c;并通过查看Akka Typed提供的两种不同模式来做到这一点&#xff1a;Receiver和Receptionist模式。 如果您是Akka Typed的新…

读书笔记 - 《乌合之众》

以往的随笔都是胡乱写两句&#xff0c;目的主要是为了督促自己尽快把堆积如山的书籍清理掉&#xff0c;但这次值得花几分钟真的写几句。其实实在都想不起来怎么会买它&#xff0c;这次偶然拿起这本书也是因为它很薄&#xff0c;读大部头读得累了放松一下&#xff0c;没想到居然…

MATLAB如何用循环分割,利用Matlab进行分割提取浮游生物

我试图从扫描图像中提取浮游生物.大纲也不错,但是,现在我不知道如何提取图像,因此可以单独保存每个浮游生物.我尝试使用标签,但是有很多噪音,它标出了每一个规格.我想知道是否有更好的方法来做到这一点.这是我的代码&#xff1a;I imread(plankton_2.jpg);figure, imshow(I), …

saxparser_使用SaxParser和完整代码进行XML解析

saxparserSAX解析器使用回调函数&#xff08;org.xml.sax.helpers.DefaultHandler&#xff09;通知客户端XML文档结构。 您应该扩展DefaultHandler并重写一些方法来实现xml解析。 覆盖的方法是 startDocument&#xff08;&#xff09;和endDocument&#xff08;&#xff09;–…

第一个Python程序

在E:\Python 下新建一个hello.py文件&#xff0c;里面的内容是print(hello world) 进入命令提示窗格&#xff0c;输入E: 点击回车 输入 cd python 点击回车 输入Python hello.py 结果如图 转载于:https://www.cnblogs.com/lgqboke/p/5882049.html

matlab导入txt生成曲面,求助:怎样将txt的数据导入到Matlab中并根据参数画出波形...

导师让我把波形画出来&#xff0c;这下完全不会啊&#xff01;希望各位高手帮帮在下……txt中部分数据如下&#xff1a;ID DDD HH:MM:SS.mmmuuun PARA1 PARA2 CH RISE COUN ENER DURATION AMP A-FRQ RMS ASL PCNTS THR R-FRQ I-FRQ SIG STRNGTH ABS-ENERGY1…

Java多线程:易失性变量,事前关联和内存一致性

什么是volatile变量&#xff1f; volatile是Java中的关键字。 您不能将其用作变量或方法名称。 期。 我们什么时候应该使用它&#xff1f; 哈哈&#xff0c;对不起&#xff0c;没办法。 当我们在多线程环境中与多个线程共享变量时&#xff0c;我们通常使用volatile关键字&…

20145219 《信息安全系统设计基础》第01周学习总结

20145219 《信息安全系统设计基础》第01周学习总结 教材学习内容总结 别出心裁的Linux命令学习法 1、Ubuntu快捷键 CTRLALTT:打开终端&#xff1b;CTRLSHIFTT&#xff1a;新建标签页&#xff1b;ALT数字N&#xff1a;终端中切换到第N个标签页&#xff1b;Tab:终端中命令补全&…

拉盖尔多项式 matlab,类氢原子的定态波函数

&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp预备知识 球坐标系中的定态薛定谔方程&#xff0c;原子单位制本文使用原子单位制&#xff0e;类氢原子(hydrogen-like atom)被定义为原子核有 $Z$ 个质子(核电荷为 $Ze$)有一个核外电子的原子/离子&#xff0…

再论EM算法的收敛性和K-Means的收敛性

标签&#xff08;空格分隔&#xff09;&#xff1a; 机器学习 &#xff08;最近被一波波的笔试面试淹没了&#xff0c;但是在有两次面试时被问到了同一个问题&#xff1a;K-Means算法的收敛性。在网上查阅了很多资料&#xff0c;并没有看到很清晰的解释&#xff0c;所以希望可以…

java xml dom getelementbyid,DOM中常见的元素获取方式

1.getElementById获取元素 返回的是一个元素对象var timer document.getElementById(time);console.dir 打印返回元素对象&#xff0c;更好的查看里面的属性和方法console.dir( timer );2.getElementsByTagName 获取某类标签元素 返回的是 获取过来元素对象的集合 以…

杰尔·地狱

什么是JAR地狱&#xff1f; &#xff08;或者是classpath地狱&#xff1f;还是依赖地狱&#xff1f;&#xff09;在考虑使用Maven或OSGi等现代开发工具时&#xff0c;哪些方面仍然有意义&#xff1f; 有趣的是&#xff0c;似乎没有对这些问题的结构化答案&#xff08;即&#…

matlab radsimp,[转载]MATLAB学习笔记(八)

符号运算符号运算分为以下几类&#xff1a;符号表达式和符号矩阵的操作整体定义为符号微积分符号线性方程符号微分方程A、符号变量、符号表达式和符号方程的分解一、 生成符号变量要使用sym和syms&#xff1a;使用sym函数可以定义符号表达式&#xff0c;此时有两种定义方法&…

windows,python3.x下安装pyspider

由于是初学者&#xff0c;业余学习&#xff0c;习惯使用windows&#xff0c;初次了解到pyspider写代码和调试代码非常简便&#xff1b;作者binux是在Ubuntu下部署测试的。在作者的博客看到windows下安装的讨论。windows直接安装失败主要是lxml、pycurl安装失败&#xff0c;需要…