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

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

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

    rest 在某些情况下,您可能想快速验证部署在开发,测试或生产环境中的REST API是否完全可以访问. 一种常见的实现方法是构建通用资源,该资源可提供例如已部署API的版本. 您可以手动触发对此资源 ...

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

    在某些情况下,您可能想快速验证部署,开发,测试或生产环境中的REST API是否完全可以访问. 一种常见的实现方法是构建通用资源,该资源可提供例如已部署API的版本. 您可以手动触发对此资源的请求,或 ...

  3. 利用arcgis-ArcMap手动快速检查重庆三调图斑的方法探讨与自动化检查的想法

    利用arcgis-ArcMap手动快速检查重庆三调图斑的方法探讨与自动化检查的想法 1.传统做法 全国第3次全国土地调查工作陆续展开,重庆也紧张的开展着调查工作,由于重庆地形多丘陵.高山.平原地区极少 ...

  4. Java快递物流查询接口,怎么接入物流接口API,如何根据单号查询物流跟踪的详细信息的Demo详细说明。

    Java怎么写物流接口,怎么接入物流接口,如何根据单号查询物流跟踪的详细信息 1. 需求 根据用户输入的订单号,我们的后台识别订单号并根据快递鸟查询快递Api接口,实现自动查询的功能 2. demo实 ...

  5. Java快递物流查询接口,怎么接入物流接口API,如何根据单号查询物流跟踪的详细信息的Demo详细说明

    Java怎么写物流接口,怎么接入物流接口,如何根据单号查询物流跟踪的详细信息 实现需求: 根据用户输入的订单号,我们的后台识别订单号并根据快递鸟查询快递Api接口,实现自动查询的功能 应用场景 实现的 ...

  6. 关于serv-u公网访问出现“打开ftp服务器上的文件夹时发生错误。请检查是否有权限访问该文件夹。详细信息:操作超时”的解决方法...

    最近给公司设置一个ftp服务器(当然是使用serv-u,:))在服务器设置好后,在本机可以访问,无论是使用ip地址(ftp://192.168.1.163),还是域名(例如域名:ftp://www.t ...

  7. idea中设置文件不检查语法_如何让IntelliJ忽略一个.js文件中的javascript语法错误?...

    在我的IntelliJ项目中,我有这个文件: MyMvnModule\src\main\webapp\WEB-INF\Owasp.csrfguard.js 此文件包含在运行时由servlet填充的这些 ...

  8. laravel api_如何在现有的Laravel应用中获取即时GraphQL API

    laravel api by Karthikeya Viswanath 通过Karthikeya Viswanath 如何在现有的Laravel应用中获取即时GraphQL API (How to g ...

  9. 如何测试病毒软件而且不中毒,不用外部工具 教你如何快速检查电脑是否被感染和中毒...

    从事应急响应工作几年之后,我认为总结一份快速确定计算机是否被感染木马和病毒的"方法论"是十分有用的.这显然不是那么简单的,可我却发现感染几乎存在于所有不复杂的攻击中,如果你执行了以 ...

最新文章

  1. 最小径集的算法_机器学习的利器——集成算法
  2. Web性能优化实践——应用层性能优化
  3. MVC,MVP 和 MVVM 的图示
  4. [Google Guava] 1.5-Throwables:简化异常和错误的传播与检查
  5. helm部署SkyWalking
  6. android 学习记录-----------android 活动 意图 碎片
  7. SQL中使用视图的优点和缺点是什么
  8. C中位域结合对齐(pragma)的例子及解释
  9. 90年代中国人一个月挣多少钱?一组数据带你看懂90年代消费情况
  10. sessionid如何产生?由谁产生?保存在哪里?
  11. SpringMVC中实现文件上传
  12. es 修改mapping
  13. 几种典型的反病毒技术:特征码技术、覆盖法技术等
  14. DOTA数据集 | 数据前后处理操作系列
  15. SQLServer CTE 递归查询
  16. 微信小程序实现一行滑动显示很多文字--scroll-view
  17. openjpeg:jpeg2000(j2k)图像内存压缩编码
  18. cmd控制台窗体大小设置
  19. 【python】透小菜参加了华为和阿里的笔试。
  20. 震动硅谷!43 岁知名技术大佬当街遇刺身亡,马斯克怒批暴力犯罪

热门文章

  1. jzoj5365-[GDOI2018模拟9.14]通信【线段树合并】
  2. CF438D-The Child and Sequence【线段树】
  3. P6835-[Cnoi2020]线形生物【期望dp】
  4. nssl1157-简单数学题【约数,换元法】
  5. eclipse搭建多module项目的坑
  6. Java 9 新特性概述
  7. Java 内存泄露总结
  8. java BigDecimal八种舍入模式
  9. java中判断 101-200 之间有多少个素数,并输出所有的素数
  10. 开放对静态资源的访问