ceph-rest-api_快速检查REST API是否有效的方法-从清单文件中获取详细信息

ceph-rest-api

在某些情况下,您可能想快速验证部署在开发,测试或生产环境中的REST API是否完全可以访问。 一种常见的实现方法是构建通用资源,该资源可提供例如已部署API的版本。 您可以手动触发对此资源的请求,或者更好的是,执行Jenkings / Hudson作业,该作业在部署后运行检查作业。 在这篇文章中,我将介绍如何实现从应用程序清单文件中读取实现细节的服务。 经验证的API是本教程中开发的API –借助Jersey和Spring在Java中进行REST API设计和实现

使用的软件

  1. 泽西岛JAX-RS实现2.14
  2. Spring4.1.4
  3. Maven 3.1.1
  4. JDK 7

REST资源

我开发了两个从清单文件读取的REST资源:

  • / manifest –将清单的主要属性作为键,值对返回
  • / manifest / implementation-details –仅返回清单文件中的实现详细信息

清单REST资源

@Path("/manifest")
public class ManifestResource {@AutowiredManifestService manifestService;@GET@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })public Response getManifestAttributes() throws FileNotFoundException, IOException{Attributes manifestAttributes = manifestService.getManifestAttributes();return Response.status(Response.Status.OK).entity(manifestAttributes).build();}	@Path("/implementation-details")@GET	@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })public Response getVersion() throws FileNotFoundException, IOException{ImplementationDetails implementationVersion = manifestService.getImplementationVersion();return Response.status(Response.Status.OK).entity(implementationVersion).build();}}

请求

GET请求示例–实施细节

GET http://localhost:8888/demo-rest-jersey-spring/manifest HTTP/1.1
Accept-Encoding: gzip,deflate
Accept: application/json
Host: localhost:8888
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)

回应– 200 OK

JSON格式的回应

{"Implementation-Title": "DemoRestWS","Implementation-Version": "0.0.1-SNAPSHOT","Implementation-Vendor-Id": "org.codingpedia","Built-By": "ama","Build-Jdk": "1.7.0_40","Manifest-Version": "1.0","Created-By": "Apache Maven 3.1.1","Specification-Title": "DemoRestWS","Specification-Version": "0.0.1-SNAPSHOT"
}

成功返回的值(HTTP状态200 OK)包含与实现和规范详细信息有关的不同默认数据。 这些是使用Maven插件自动生成的清单文件,我将在下一部分中介绍。

用Maven生成清单文件

由于演示应用程序是一个Web应用程序,因此我使用Apache Maven Archiver支持的Apache maven war插件来生成清单文件:

maven-war-plugin配置

<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><version>2.5</version><configuration><warName>${project.artifactId}</warName><archive><manifest><addDefaultImplementationEntries>true</addDefaultImplementationEntries><addDefaultSpecificationEntries>true</addDefaultSpecificationEntries></manifest></archive>					</configuration><executions><execution><phase>package</phase><goals><goal>manifest</goal></goals><inherited>true</inherited></execution></executions>				
</plugin>

从pom.xml文件中定义的项目属性中,addDefaultImplementationEntries和addDefaultSpecificationEntries将分别生成默认实现和规范详细信息:

默认实施细节

Implementation-Title: ${project.name}
Implementation-Version: ${project.version}
Implementation-Vendor-Id: ${project.groupId}
Implementation-Vendor: ${project.organization.name}
Implementation-URL: ${project.url}

, 分别:

默认规格详细信息

Specification-Title: ${project.name}
Specification-Version: ${project.version}
Specification-Vendor: ${project.organization.name}

有关更多详细信息,请参见Apache Maven Archiver 。

请注意,为了也在文件系统中的webapp / META-INF下生成Manifest.mf文件,您需要将清单目标绑定到执行阶段(例如,包):

将清单目标绑定到打包阶段

<executions><execution><phase>package</phase><goals><goal>manifest</goal></goals><inherited>true</inherited></execution>
</executions>

从清单文件读取

从清单文件读取发生在注入的ManifestService类中:

ManifestService.java

public class ManifestService {@AutowiredServletContext context;Attributes getManifestAttributes() throws FileNotFoundException, IOException{InputStream resourceAsStream = context.getResourceAsStream("/META-INF/MANIFEST.MF");Manifest mf = new Manifest();mf.read(resourceAsStream);Attributes atts = mf.getMainAttributes();return atts;	    		}	ImplementationDetails getImplementationVersion() throws FileNotFoundException, IOException{String appServerHome = context.getRealPath("/");File manifestFile = new File(appServerHome, "META-INF/MANIFEST.MF");Manifest mf = new Manifest();mf.read(new FileInputStream(manifestFile));Attributes atts = mf.getMainAttributes();ImplementationDetails response = new ImplementationDetails();response.setImplementationTitle(atts.getValue("Implementation-Title"));response.setImplementationVersion(atts.getValue("Implementation-Version"));response.setImplementationVendorId(atts.getValue("Implementation-Vendor-Id"));return response;		}}

要访问MANIFEST.MF文件,您需要注入ServletContext并调用其方法之一。

  • SerlvetContext#getResourceAsStream() –(首选方式)
  • ServletContext#getRealPath() –获取与给定虚拟路径相对应的真实路径。 返回的实际路径将采用适合运行servlet容器的计算机和操作系统的形式,包括适当的路径分隔符。 在这种情况下,最大的问题是,如果不部署.war爆炸,则将无法访问清单文件。

Java EE版本

在JavaEE环境中,您可以通过@Context批注注入ServletContext:

Java EE实施版本

public class ManifestResource {@ContextServletContext context;@GET@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })	public Response getManifestAttributes() throws FileNotFoundException, IOException{InputStream resourceAsStream = context.getResourceAsStream("/META-INF/MANIFEST.MF");Manifest mf = new Manifest();mf.read(resourceAsStream);Attributes atts = mf.getMainAttributes();return Response.status(Response.Status.OK).entity(atts).build();	    		}...
}

在这里,您可以找到一种快速的方法来验证REST api是否可以访问。

资源资源

  1. 阿帕奇Maven
    1. Apache Maven存档器
    2. 构建生命周期简介#Built-in_Lifecycle_Bindings
  2. Oracle文档– 处理清单文件:基础知识
  3. 堆栈溢出
    1. 如何在运行时获取Maven Artifact版本?
    2. 如何像Pom一样从Java方法获取Maven项目版本

翻译自: https://www.javacodegeeks.com/2015/01/quick-way-to-check-if-the-rest-api-is-alive-get-details-from-manifest-file.html

ceph-rest-api

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

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

相关文章

set trans 必须是事务处理的第一个语句_MySQL中特别实用的几种SQL语句送给大家

在写SQL时&#xff0c;经常灵活运用一些SQL语句编写的技巧&#xff0c;可以大大简化程序逻辑。减少程序与数据库的交互次数&#xff0c;有利于数据库高可用性&#xff0c;同时也能显得你的SQL很牛B&#xff0c;让同事们眼前一亮。实用的SQL1.插入或替换如果我们想插入一条新记录…

C语言预处理命令总结

预处理指令是以#号开头的代码行&#xff0c;# 号必须是该行除了任何空白字符外的第一个字符。# 后是指令关键字&#xff0c;在关键字和 # 号之间允许存在任意个数的空白字符&#xff0c;整行语句构成了一条预处理指令&#xff0c;该指令将在编译器进行编译之前对源代码做某些转…

突破极限–如何使用AeroGear Unified Push for Java EE和Node.js

在2014年底的AeroGear队宣布红帽的JBoss统一推送服务器的可用性xPaaS 。 让我们仔细看看&#xff01; 总览 统一推送服务器允许开发人员将本地推送消息发送到Apple的推送通知服务&#xff08;APNS&#xff09;和Google的云消息传递&#xff08;GCM&#xff09;。 它具有内置的…

java 运行os文件路径_Java获取文件路径的几种方式

关于绝对路径和相对路径&#xff1a; 绝对路径就是你的主页上的文件或目录在硬盘上真正的路径&#xff0c;(URL和物理路径)例如&#xff1a;C:xyz est.txt 代表了test.txt文件的绝对路径。http://www.sun.com/index.htm也代表了一个URL绝对路径。相 对路径&#xff1a;相对与某…

mysql 分词搜索_实战 | canal 实现Mysql到Elasticsearch实时增量同步

题记关系型数据库Mysql/Oracle增量同步Elasticsearch是持续关注的问题&#xff0c;也是社区、QQ群等讨论最多的问题之一。 问题包含但不限于&#xff1a; 1、Mysql如何同步到Elasticsearch? 2、Logstash、kafka_connector、canal选型有什么不同&#xff0c;如何取舍&#xff1…

C memset 踩坑

一、前言memset 作为对内存初始化的函数&#xff0c;还是有不少坑和误区的&#xff0c;今天就来对这个函数作一个总结。二、函数作用最简单的调用就是将一个数组清零&#xff0c;代码如下&#xff1a;const int maxn 1024; int a[maxn]; memset(a, 0, sizeof(a)); // a[0]a[1…

eap和psk_针对WildFly和EAP运行Java Mission Control和Flight Recorder

eap和pskJava Mission Control &#xff08;JMC&#xff09;使您可以监视和管理Java应用程序&#xff0c;而无需引入通常与这些类型的工具相关的性能开销。 它使用为正常的JVM动态优化而收集的数据&#xff0c;从而形成了一种非常轻量级的方法来观察和分析应用程序代码中的问题…

java与html关联_java-如何在HTML文件中搜索某些标签?

我在Java中有一个小问题.操作方法&#xff1a;我想在HTML文件中搜索标签href和src,然后获取与该标签关联的URL.最好的方法是什么&#xff1f;谢谢您的帮助.最好的祝福.解决方法:这是我用来完全完成您想要做的事情的代码,但首先让我给您一些提示.如果您在Java Swing环境中,请确保…

python中history()_keras中的History对象用法

keras中的fit_generator和fit函数均返回History对象&#xff0c;那么History怎么用呢&#xff1f;事实上History对象已经记录了运行输出。在了解之前&#xff0c;我们甚至自己定义回调函数记录损失和准确率等。相关keras源码位于网址&#xff1a;class History(Callback):"…

C语言合法标识符

Problem Description输入一个字符串&#xff0c;判断其是否是C的合法标识符。Input输入数据包含多个测试实例&#xff0c;数据的第一行是一个整数n,表示测试实例的个数&#xff0c;然后是n行输入数据&#xff0c;每行是一个长度不超过50的字符串。Output对于每组输入数据&#…

线程魔术技巧:使用Java线程可以做的5件事

Java线程最鲜为人知的事实和用例是什么&#xff1f; 有些人喜欢爬山&#xff0c;有些人喜欢跳伞。 我&#xff0c;我喜欢Java。 我喜欢它的一件事是&#xff0c;您永不停止学习。 您每天使用的工具通常可以为您带来全新的面貌&#xff0c;以及您还没有机会看到的方法和有趣的用…

python正则表达式面试_Python面试 Re-正则表达式

1.python正则表达式中匹配(match)和查找(search)的区别答&#xff1a;正则表达式中match和search的方法比较相似相同点&#xff1a;都是在一个字符串s中寻找pat子字符串&#xff0c;如果能找到&#xff0c;就返回一个Match对象&#xff0c;如果找不到&#xff0c;就返回None。不…

java webview框架_java - Android WebView 无法正常显示网页图表

Android客户端中混搭HTML页面&#xff0c;会出现虽然HTML内容载入完成&#xff0c;标题也正常显示&#xff0c;但是整个网页需要等到近5秒(甚至更多)时间才会显示出来。研究了很久&#xff0c;搜遍了国外很多网站&#xff0c;也看过PhoneGap的代码&#xff0c;一直无解。 …

每日干货丨C语言数组知识点总结

一&#xff0e;一维数组1. 初始化方法第一种&#xff1a;完全初始化。依次赋值如&#xff1a;a[5] {2&#xff0c;3&#xff0c;4, 5, 6}&#xff1b;a[] {1&#xff0c;2, 3, 4, 5, 6};第二种&#xff1a;不完全初始化。初始化式中的值从a[0]开始&#xff0c;依次向后赋值&a…

python isnumber_Python正课18 —— 基本数据类型 - 字符串类型

一&#xff1a;定义msg hello #本质:name str(任意形式内容)二.类型转换数据类型转换&#xff1a;str()可以将任意数据类型转换成字符串类型&#xff0c;例如# msg hello # msg str(hello)# print(type(msg))三&#xff1a;使用(内置方法)优先掌握&#xff1a;1.按索引取值…

微服务构架 esb总线_好的微服务架构=企业服务总线(ESB)的灭亡?

微服务构架 esb总线如今&#xff0c;似乎每个人都在谈论微服务。 您可以在数百篇文章和博客文章中读到很多有关该主题的文章&#xff0c;但是我建议的出发点是Martin Fowler的这篇文章 &#xff0c; 该文章引发了有关这种新建筑概念的大量讨论。 本文介绍了创建良好的微服务架构…

java8方法引用符合_Java8 方法引用和构造方法引用

如果不熟悉Java8新特性的小伙伴&#xff0c;初次看到函数式接口写出的代码可能会是一种懵逼的状态&#xff0c;我是谁&#xff0c;我在哪&#xff0c;我可能学了假的Java&#xff0c;(・∀・(・∀・(・∀・*)&#xff0c;但是语言都是在进步的&#xff0c;就好比面向对象的语言…

C语言指南-数组之谜

前言在C语言中&#xff0c;数组和指针似乎总是“暧昧不清”&#xff0c;有时候很容易把它们混淆。本文就来理一理数组和指针之间到底有哪些异同。数组回顾在分析之前&#xff0c;我们不妨回顾一下数组的知识。数组是可以存储一个固定大小的相同类型元素的顺序集合。为了便于我们…

python生成uuid_咸鱼高赞回答:有什么相见恨晚的Python技巧,附赠python最新教程...

日常工作几乎离不python。一路走来&#xff0c;他积累了不少有用的技巧和tips&#xff0c;现在就将这些技巧分享给大家。这些技巧将根据其首字母按A-Z的顺序进行展示。Python相关学习资料获取方式&#xff1a;转发文章关注私信【Python】ALL OR ANYPython之所以成为这么一门受欢…

maven将第三方依赖_如何将商业第三方文物整合到您的Maven版本中

maven将第三方依赖根据ZeroTurnaround的RebelLabs最近进行的一项调查 &#xff0c;Maven仍然是领先的Java构建平台。 根据RebelLabs&#xff0c;当前的市场份额分布是&#xff1a; Maven的64&#xff05; 蚂蚁常春藤与16.5&#xff05; Gradle与11&#xff05; 但是&#x…