mime类型是什么类型_使用多种MIME类型测试REST

mime类型是什么类型

1.概述

本文将重点介绍测试具有多种媒体类型/表示形式的RESTful服务。 这是有关使用Spring和基于Java的配置的Spring Security设置安全的RESTful Web服务的系列文章的第十篇。

REST with Spring系列:

  • 第1部分 – 使用Spring 3.1和基于Java的配置引导Web应用程序
  • P艺术2 - 构建RESTful Web服务使用Spring 3.1和Java配置
  • P艺术3 - 保护RESTful Web服务使用Spring Security 3.1
  • 第4部分 – RESTful Web服务可发现性
  • 第5部分 – 使用Spring进行REST服务发现
  • 第6部分 – 使用Spring Security 3.1的RESTful服务的基本身份验证和摘要身份验证
  • 第7部分 – Spring的REST分页
  • 第8部分 – 使用Spring Security对RESTful服务进行身份验证
  • 第9部分 – 带有Spring的REST的ETag

2.目标

任何RESTful服务都需要使用某种媒体类型将其资源作为表示形式公开,并且在许多情况下,还需要多个媒体类型。 客户端将设置Accept标头以选择其从服务中请求的表示形式。 由于资源可以具有多种表示形式,因此服务器将必须实现一种负责选择正确表示形式的机制-也称为内容协商。 因此,如果客户端请求application / xml ,那么它应该获得Resource的XML表示,如果客户端请求application / json ,那么应该获得JSON。

本文将说明如何编写能够在RESTful Service支持的多种表示形式之间切换的集成测试。 目标是能够使用完全相同的服务URI运行完全相同的测试,而只是要求使用不同的媒体类型。

3.测试基础架构

我们将从为编组人员定义一个简单的接口开始–这将是允许测试在不同媒体类型之间进行切换的主要抽象:

public interface IMarshaller {...String getMime();
}

然后,我们需要一种基于某种形式的外部配置来初始化正确的编组器的方法。 对于这种机制,我们将使用Spring FactoryBean来初始化编组器,并使用一个简单的属性来确定要使用的编组器:

@Component
@Profile('test')
public class TestMarshallerFactory implements FactoryBean<IMarshaller> {@Autowiredprivate Environment env;public IMarshaller getObject() {String testMime = env.getProperty('test.mime');if (testMime != null) {switch (testMime) {case 'json':return new JacksonMarshaller();case 'xml':return new XStreamMarshaller();default:throw new IllegalStateException();}}return new JacksonMarshaller();}public Class<IMarshaller> getObjectType() {return IMarshaller.class;}public boolean isSingleton() {return true;}
}

让我们来看一下:

  • 首先,这里使用了Spring 3.1中引入的新的Environment抽象-有关更多信息,请查看带有Spring的属性文章。
  • 从环境中检索test.mime属性 ,并用于确定要创建哪个封送处理程序-一些Java 7在这里使用String语法
  • 接下来,如果根本没有定义该属性,则默认的marshaller将成为支持JSON的Jackson marshaller
  • 最后–此BeanFactory仅在测试场景中处于活动状态,因为使用了Spring 3.1中引入的新@Profile支持

就是这样–该机制能够根据test.mime属性的值在编组器之间进行切换。

4. JSON和XML编组器

继续,我们将需要实际的marhsaller实施-每个受支持的媒体类型一个。

对于JSON,我们将使用Jackson作为基础库:

public class JacksonMarshaller implements IMarshaller {private ObjectMapper objectMapper;public JacksonMarshaller() {super();objectMapper = new ObjectMapper();}...@Overridepublic String getMime() {return MediaType.APPLICATION_JSON.toString();}
}

为了获得XML支持,编组人员使​​用XStream

public class XStreamMarshaller implements IMarshaller {private XStream xstream;public XStreamMarshaller() {super();xstream = new XStream();}...public String getMime() {return MediaType.APPLICATION_XML.toString();}
}

请注意,这些编组器未定义为它们自己的Spring组件。 原因是它们将由TestMarshallerFactory引导到Spring上下文中,因此不需要直接使它们成为组件。

5.同时使用JSON和XML来使用服务

在这一点上,我们应该能够对已部署的RESTful服务进行全面的集成测试。 使用编组器很简单–将IMarshaller直接注入到测试中即可:

@ActiveProfiles({ 'test' })
public abstract class SomeRestLiveTest {@Autowiredprivate IMarshaller marshaller;// tests...
}

Spring将注入的确切编组器当然将取决于test.mime属性的值; 这可以从属性文件中获取,也可以直接在测试环境中手动设置。 但是,如果没有为此属性提供值,则TestMarshallerFactory将仅使用默认的编组器JSON编组器。

6. Maven和詹金斯

如果将Maven设置为针对已部署的RESTful服务运行集成测试,则可以这样运行:

mvn test -Dtest.mime=xml

或者,如果此构建使用Maven生命周期的集成测试阶段:

mvn integration-test -Dtest.mime=xml

有关如何使用这些阶段,以及如何建立一个Maven构建,使其应用程序预集成测试目标的部署约束,在集成测试目标,然后关运行集成测试的详细信息在post-integration-test中查看部署的服务,请参阅与Maven进行集成测试

使用Jenkins时 ,作业必须配置为:

This build is parameterized

并添加了String参数test.mime = xml

常见的Jenkins配置是必须针对已部署的服务运行运行同一组集成测试的作业-一个使用XML,另一个使用JSON表示。

7.结论

本文介绍了如何正确测试REST API。 大多数API的确会以多种表示形式发布其资源,因此测试所有这些表示形式至关重要,因此使用完全相同的测试非常酷。

要在实际的集成测试中全面验证这种机制,以验证所有资源的XML和JSON表示形式,请查看github项目 。

参考:来自baeldung博客的JCG合作伙伴 Eugen Paraschiv对具有多种MIME类型的REST进行了测试 。

翻译自: https://www.javacodegeeks.com/2013/01/testing-rest-with-multiple-mime-types.html

mime类型是什么类型

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

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

相关文章

Go-Mutex互斥量

先来看一段go1.12.5中Mutex的源码&#xff1a; // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file.// Package sync provides basic synchronization primiti…

spss方差分析_【案例】SPSS统计分析:多因素方差分析

&#xff0d; 点击上方“中国统计网”订阅我吧&#xff01;&#xff0d;多因素方差分析&#xff0c;用于研究一个因变量是否受到多个自变量(也称为因素)的影响&#xff0c;它检验多个因素取值水平的不同组合之间&#xff0c;因变量的均值之间是否存在显著的差异。多因素方差分…

你好世界

想打个Hello World&#xff0c;但是又没有继续下去。 今天买茶百道的时候&#xff0c;做茶的女孩子很开朗很友善&#xff0c;在她递给我装好的山竹荔枝的时候我闻到水果的苦味&#xff0c;于是捧住杯子埋头下去闻了一下&#xff0c;她笑着说&#xff0c;“每次我做这个的时候都…

sqlserver免安装_SQL数据分析,如何免安装在线运行?

大家好&#xff0c;在之前写了一篇关于SQL软件安装&#xff0c;读者普遍反映&#xff0c;这个软件有点不好安装&#xff0c;但是&#xff0c;从事数据分析行业&#xff0c;熟练使用SQL软件是必须的&#xff0c;于是乎......本文推送一篇免安装的&#xff0c;可以在线运行的SQL软…

python自动导出数据脚本_利用python生成一个导出数据库的bat脚本文件的方法

# 环境: python3.xdef getExportDbSql(db, index):# 获取导出一个数据库实例的sql语句sql mysqldump -u%s -p%s -h%s -P%d --default-character-setutf8 --databases mu_ins_s%s > %s.s%d.mu_ins_%d.sql %(db[user], db[pwd], db[host], db[port], index, db[server], inde…

java内存模型和内存结构_Java内存模型和优化

java内存模型和内存结构总览 许多多线程代码开发人员都熟悉这样的想法&#xff0c;即不同的线程可以对持有的值有不同的看法&#xff0c;这不是唯一的原因&#xff0c;即如果线程不安全&#xff0c;它可能不会看到更改。 JIT本身可以发挥作用。 为什么不同的线程看到不同的值&…

ANTLR巨型教程

解析器是功能强大的工具&#xff0c;使用ANTLR&#xff0c;您可以编写可用于多种不同语言的各种解析器。 在本完整的教程中&#xff0c;我们将要&#xff1a; 解释基础 &#xff1a;解析器是什么&#xff0c;解析器可以用于什么 了解如何设置要从Javascript&#xff0c;Pyth…

Web进程被kill掉后线程还在运行怎么办?

目录 背景描述原因分析处理方案参考背景描述 系统有一个配置表&#xff0c;系统在启动后会启动一个线程&#xff0c;每隔5分钟将配置表里所有的数据更新到内存中。 系统是通过jenkins构建&#xff08;直接kill掉Web进程&#xff0c;然后传入新的包再启动&#xff09;的&#xf…

北京学python 价格怎么样_北京学习Python需要多少钱

Python本身语言具有一定的优势所在&#xff0c;简单易学&#xff0c;就业方向多&#xff0c;也就意外着从事Python的工程师相对于其他编程语言的工程师来说&#xff0c;就业机会更多&#xff0c;薪资待遇更高。1、web网站工程师&#xff1a;我们都知道web是我们一直不能忽视的存…

go Windows Service

相关库 https://godoc.org/golang.org/x/sys/windows/svchttps://github.com/kardianos/servicehttps://github.com/judwhite/go-svchttps://github.com/btcsuite/winsvc参考 云监控Go语言版本插件介绍 - 这个不知道用的什么库实现的Cannot start golang application exe as a …

华为南太无线解决方案部梁旭阳_华为无线充电新专利:激光无线充电,替代传统半接触式...

传统的无线充电技术是用感应线圈通过短距离&#xff0c;实际上是有接触式充电&#xff0c;但是相对于真正的无线充电&#xff0c;还是不够便利&#xff0c;最近&#xff0c;华为新无线充电技术曝光&#xff1a;激光无线充电。虽然无线充电已在近年得到了较大的普及&#xff0c;…

jquery的懒加载记录一下踩得坑

官网下载地址&#xff1a;http://plugins.jquery.com/lazyload/ 要引入两个文件&#xff0c;注意这些事html中包含着 <script src"https://code.jquery.com/jquery-1.11.3.min.js"></script><script src"js/jquery.lazyload.js"></sc…

rsync 同步优化_可以优化同步吗?

rsync 同步优化总览 有一个常见的误解&#xff0c;因为JIT很智能&#xff0c;并且可以消除对象的同步&#xff0c;而该对象仅存在于不影响性能的方法中。 比较StringBuffer和StringBuilder的测试 这两个类基本上做同样的事情&#xff0c;除了一个是同步的&#xff08;StringBu…

sudoers 用户权限配置_使用sudo让普通用户获取root用户的权限

sudo 是 Linux 系统管理指令&#xff0c;是允许系统管理员让普通用户执行一些或者全部的 root 命令的一个工具&#xff0c;如 halt&#xff0c;reboot&#xff0c;su 等等。这样不仅减少了 root 用户的登录 和管理时间&#xff0c;同样也提高了安全性。sudo不是对 shell 的一个…

Spring Boot –使用执行器端点在运行时配置日志级别

从Spring Boot 1.5开始&#xff0c;新的loggers器执行器端点允许在运行时查看和更改应用程序记录级别。 将spring-boot-actuator添加到您的项目 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator&…

Python学习教程:Python增强赋值及共享引用注意事项

Python学习教程&#xff1a;Python增强赋值及共享引用注意事项 概述 Python中的增强赋值是从C语言中借鉴出来的&#xff0c;所以这些格式的用法大多和C一致&#xff0c;本身就是对表达式的简写&#xff0c;即二元表达式和赋值语句的结合&#xff0c;比如a b 和a a b 就是一致…

python math.sinh_Python numpy.sinh()用法及代码示例

numpy.sinh(x [&#xff0c;out]) ufuncsin)&#xff1a;此数学函数可帮助用户计算所有x(作为数组元素)的双曲正弦值。等效于1/2 *(np.exp(x)-np.exp(-x))或-1j * np.sin(1j * x)。参数&#xff1a;array :[数组]元素以弧度为单位。2pi弧度 36o度返回&#xff1a;对于所有x即数…

中国大学MOOC-陈越、何钦铭-数据结构-2019春期末考试(题目+部分解答)

欢迎评论&#xff08;指正或是询问都可&#xff09;&#xff0c;谢谢大家 一、判断题 思路很正常的题目。 1-4反例&#xff1a;4个顶点只用3条边就可以做到全连通。所以边数可能等于顶点个数减一。错误。 二、选择题 2-8需要细心的做一下双旋操作&#xff0c; 2-12 C 设数字 {…

分析java 线程占用内存_Java线程:保留的内存分析

分析java 线程占用内存本文将为您提供一个教程&#xff0c;使您可以确定活动应用程序Java线程中保留了多少Java堆空间 。 将提供来自Oracle Weblogic 10.0生产环境的真实案例研究&#xff0c;以使您更好地理解分析过程。 我们还将尝试证明过多的垃圾回收或Java堆空间的内存占用…

图像傅里叶变换

1傅里叶变换物理意义 图像的频率是表征图像中灰度变化剧烈程度的指标&#xff0c;是灰度在平面空间上的梯度。如&#xff1a;大面积的沙漠在图像中是一片灰度变化缓慢的区域&#xff0c;对应的频率值很低&#xff1b;而对于地表属性变换剧烈的边缘区域在图像中是一片灰度变化剧…