rest-assured的对象映射(序列化和反序列化)
rest-assured支持映射Java对象到Json和XML以及从Json和XML中映射到Java对象。Json映射需要在classpath 中有Jackson、Jackson 2或者是Gson,XML映射需要在classpath 中有JAXB。
一、序列化
序列化:序列化Java对象到Json或Xml
假设我们有这样一个Java Object:
public class Message {
private String message; public String getMessage() {
return message;
} public void setMessage(String message) {
this.message = message;
}
}
我们想序列化这个对象为Json,并且将Json传递给request请求,这里有几种方法可以做到,比如说:
1.基于Content-Type的序列化
Message message = new Message();
message.setMessage("My messagee");
given().
contentType("application/json").
body(message).
when().
post("/message");
在这个例子中,因为请求的content-type被设置为“application/json”,所以rest-assured将序列化这个message对象为Json。rest-assured首先会尝试从classpath中寻找Jackson,如果Jackson没有找到的话,则会使用Gson。如果你将content-type被设置为“application/xml”,rest-assured将使用JAXB,序列化这个message对象为XML。如果content-type没有定义,那么rest-assured将会按照下列顺序序列化对象:
1.使用Jackson 2将对象序列化为Json(Faster Jackson (databind),数据绑定的速度比Jackson快)
2.使用Jackson将对象序列化为Json(databind)
3.使用Gson将对象序列化为Json
4.使用JAXB将对象序列化为XML
同时rest-assured也关心content-type的字符集,比如:
Message message = new Message();
message.setMessage("My messagee");
given().
contentType("application/json; charset=UTF-16").
body(message).
when().
post("/message");
你也可以将message对象序列化为表单参数:
Message message = new Message();
message.setMessage("My messagee");
given().
contentType("application/json; charset=UTF-16").
formParam("param1", message).
when().
post("/message");
这个message对象将会序列化为字符集为UTF-16的Json(使用Jackson 或者 Gson ,如果存在的话)。
2.通过HashMap来创建Json
你可以提供一个Map,rest-assured将会使用这个map创建Json文件
Map<String,Object> map = new HashMap<String,Object>();
map.put("firstName","lwj");
map.put("lastName","nicole"); given().
contentType(JSON).
body(map).
when().
post("/somewhere"").
then().
statusCode(200);
上面的例子会产生一个Json数据:
{ "firstName" : "lwj", "lastName" : "nicole" }
3.使用显示序列化器
如果在你的classpath中同时存在多个Object Mappers(对象映射),或者你并不关心 content-type 的设置,那么你就可以指定一个显示序列化器来进行序列化:比如:
Message message = new Message();
message.setMessage("My messagee");
given().
body(message, ObjectMapperType.JAXB).
when().
post("/message");
在这个例子当中,rest-assured使用JAXB将Message对象序列化为XML。
二、反序列化
反序列化:将响应体反序列化为Java对象
假设我们有这样一个Java对象:
public class Message {
private String message; public String getMessage() {
return message;
} public void setMessage(String message) {
this.message = message;
}
}
接下来我们想将响应体反序列化为Message 对象:
1.基于Content-Type的反序列化
假设服务端返回这样一个Json数据:
{"message":"My message"}
将这个json数据反序列化为Message对象,我们可以这样做:
Message message = get("/message").as("Message.class");
想要将上面的Json数据反序列化为Message对象,响应体(response)的content-type必须是"application/json"(或者是其他包含json的类型)。
假设服务端返回下面类型的数据(xml):
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<message>
<message>My message</message>
</message>
并且响应体的content-type是"application/xml",完全不用修改任何代码:
Message message = get("/message").as("Message.class");
1.1 自定义Content-Type反序列化
如果服务端返回一个自定义的Conten-Type,比说:"application/something",你仍然想使用rest-assured的对象映射,那么这里有两个方法可以做到:你可以使用显示指定的方法,或者是为自定义的Content-Type注册一个解析器:
Message message = expect().parser("application/somthing",Parser.XML).when().get("/message").as(Message.class);
或者:
Message message = expect().defaultParser(Parser.XML).when().get("/message").as(Message.class);
当然你也可以注册一个默认解析器或者是静态自定义一个解析器,或者使用specification.
2.使用显示反序列化器
如果在你的classpath中同时有多个对象映射,或者说你并不关心响应体的content-type,你可以指定一个显示的反序列化器,比如:
Message message = get("/message").as(Message.class,ObjectMapperType.GSON);
3.配置(ObjectMapperConfig)
你可以使用ObjectMapperConfig来配置一个预定义的对象映射,并且将其传递到详细配置当中去(detailed configuration),比如:将GSON的命名策略改成LowerCaseWithUnderscores(一种策略,将大写字母改为小写字母并添加下划线),可以这样做:
RestAssured.config = RestAssuredConfig.config().objectMapperConfig(objectMapperConfig().gsonObjectMapperFactory(
new GsonObjectMapperFactory() {
public Gson create(Class cls, String charset) {
return new GsonBuilder().setFieldNamingPolicy(LOWER_CASE_WITH_UNDERSCORES).create();
}
}
));
这里为GSON, JAXB, Jackson和Faster Jackson都预定义了对象映射工厂。
4.自定义ObjectMapper
默认情况下,rest-assured将会扫描classpath中各种各样的Object Mappers。如果你想集成一个Object Mappers,默认情况下rest-assured是不支持,或者你自己封装,你可以实现 io.restassured.mapper.ObjectMapper 接口。你需要告诉rest-assured使用你自定义的Object Mappers,或者是将自定义的Object Mappers作为第二个参数传递给body:
given().body(myJavaObject,myObjectMapper).when().post("....");
或者你可以静态定义:
RestAssured.config = RestAssuredConfig.config().objectMapperConfig(new ObjectMapperConfig(myObjectMapper));
三、自定义解析器
rest-assured提供了预定义的解析器,例如HTML、XML、JSON。但是你可以通过注册一个预定义的解析器来解析一些现在不支持的内容类型,通过以下方法来注册:
RestAssured.registerParser(<content-type>, <parser>);
例如:注册一个可以解析"application/vnd.uoml+xml"类型的解析器,需要使用XML parser这样做:
RestAssured.registerParser("application/vnd.uoml+xml", Parser.XML);
你也可以通过下面的方法来注销解析器:
RestAssured.unregisterParser("application/vnd.uoml+xml");
解析器也可以指定于每一个请求中:
get("...").then().using().parser("application/vnd.uoml+xml", Parser.XML);
然后使用response specification
四、默认解析器
有时候指定一个默认的解析器非常有用,比如:当中响应体中不包含任何content-type的时候:
RestAssured.defaultParser = Parser.JSON;
当然,你也可以为某个请求指定默认解析器:
get("/x").then().using().defaultParser(Parser.JSON). ..
然后使用response specification
rest-assured的对象映射(序列化和反序列化)的更多相关文章
- java中对象的序列化和反序列化
[对象的序列化和反序列化 ] 1.定义:序列化--将对象写到一个输出流中.反序列化则是从一个输入流中读取一个对象.类中的成员必须是可序列化的,而且要实现Serializable接口,这样的类的对象才能 ...
- Java对象的序列化与反序列化
序列化与反序列化 序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程.一般将一个对象存储至一个储存媒介,例如档案或是记亿体缓冲等.在网络传输过程中,可以是字节或是 ...
- Java对象的序列化和反序列化[转]
Java基础学习总结--Java对象的序列化和反序列化 一.序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化.把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用 ...
- 【Java IO流】对象的序列化和反序列化
对象的序列化和反序列化 1)对象序列化,就是将Object对象转换成byte序列,反之叫对象的反序列化. 2)序列化流(ObjectOutputStream),是字节的过滤流—— writeObjec ...
- Java对象的序列化与反序列化-Json篇
说到Java对象的序列化与反序列化,我们首先想到的应该是Java的Serializable接口,这玩意在两个系统之间的DTO对象里面可能会用到,用于系统之间的数据传输.或者在RPC(远程方法调用)时可 ...
- 利用JavaScriptSerializer类 进行Json对象的序列化和反序列化和过滤
项目下载:JavaScriptSerializer_对JSON对象序列化与反序列化及过滤器 利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化 1. 首 ...
- 对象的序列化与反序列化---IO学习笔记(四)
对象的序列化,反序列化 对象的序列化: 就是将Object转换成byte序列 对象的反序列化: 将byte序列转换成Object 序列化流.反序列化流 序列化流(ObjectOutputStream) ...
- 第12讲-Java中的IO操作及对象的序列化与反序列化
1.知识点 1.1.课程回顾 1.2.本章重点 1.2.1 io操作 1.2.2 对象的序列化与反序列化 2.具体内容 2.1.Java IO 2.1.1.什么是IO IO其实就是输入.输出 I ...
- (记录)Jedis存放对象和读取对象--Java序列化与反序列化
一.理论分析 在学习Redis中的Jedis这一部分的时候,要使用到Protostuff(Protobuf的Java客户端)这一序列化工具.一开始看到序列化这些字眼的时候,感觉到一头雾水.于是,参考了 ...
随机推荐
- C# 把一个文件夹下所有文件复制到另一个文件夹下 把一个文件夹下所有文件删除(转)
C# 把一个文件夹下所有文件复制到另一个文件夹下 public static void CopyDirectory(string srcPath, string destPath) { try { ...
- jmeter 插件
- ssh时传递环境变量
设置要传递的变量: -o SendEnv=Varname 但是不是每个都能传,受服务器上sshd_config里的下面两个选项的控制: AcceptEnv and PermitUserEnvironm ...
- asp.net服务器推送长连接
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx. ...
- linux下mariadb的下载与卸载
Linux下mariadb的安装 使用阿里云的mariadb yum install mariadb-server mariadb -y 启动mariadb数据库 systemctl start/st ...
- Java学习——JSTL标签与EL表达式之间的微妙关系
原文总结的太好了,忍不住记录.转发. 原文地址:http://blog.csdn.net/u010168160/article/details/49182867 目录(?)[-] 一EL表达式 EL相 ...
- C#request和response的中文乱码问题
request乱码指的是:浏览器向服务器发送的请求参数中包含中文字符,服务器获取到的请求参数的值是乱码: response乱码指的是:服务器向浏览器发送的数据包含中文字符,浏览器中显示的是乱码: ...
- jQuery对象与DOM对象及互相转化
<p id=‘’hello”></p> 普通处理,通过标准JavaScript处理: var p = document.getElementById('hello'); p.i ...
- [GO]数组指针做函数参数
package main import "fmt" //p指向实现数组a,它是指向数组,它是数组指针//*p指向指针指向的内存,就是实参a func modify1(p *[]in ...
- 四则运算(Java) 陈志海 邓宇
目录 Github项目地址 PSP表格 功能要求 题目 功能(已全部实现) 效能分析 设计实现过程 数值生成 算式生成 问题集生成 设计实现过程 代码说明 测试运行 代码覆盖率 项目小结 Github ...