rest-assured之如何指定请求数据(Specifying Request Data 包括请求参数、请求头、cookie等)
我们除了可以为一个请求指定请求参数之外,还可以指定请求头(header)、cookies、请求体(body)以及请求内容类型(content-type)等,下面我们就来一一介绍一下:
一、请求HTTP资源
我们通常在 request specification 中可以调用任何 HTTP方法 来执行一个请求,比如:
when().get("/x"). ..;
上面的例子中,get 就是HTTP请求方法。
从rest-assured的3.0.0版本开始,我们可以通过下面的方法在HTTP请求当中使用HTTP动词来发送请求:
when().
request("CONNECT", "/somewhere").
then().
statusCode(200);
上面的例子中,rest-assured就会发送一个 connect 请求到服务端。
扩展:对于资源的具体操作类型,由HTTP动词表示。常见的HTTP动词包括下面五个动词(括号里是对应的SQL命令):
- GET(SELECT):从服务器取出资源(一项或多项)。
- POST(CREATE):在服务器新建一个资源。
- PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)
- PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性)。
- DELETE(DELETE):从服务器删除资源。
二、请求参数
通常我们是通过下面的方式来指定请求参数:
given().
param("param1", "value1").
param("param2", "value2").
when().
get("/something");
上面的例子中,rest-assured将会根据HTTP的请求方法自动判断使用哪一种参数类型(query or form ,查询类型或者表单类型),如果是 GET 请求方法,那么将使用查询类型(query parameters)请求参数;如果是 POST 请求方法,那么将会使用 form 表单参数。在有些测试用例(PUT 或者是 POST)当中,将表单参数和查询参数分开是非常重要的。那么我们就可以这么做:
given().
formParam("formParamName", "value1").
queryParam("queryParamName", "value2").
when().
post("/something");
请求参数也可以直接设置在URL上面:
..when().get("/name?firstName=John&lastName=Doe");
对于 multi-part parameters 下面再介绍。
1.多值的请求参数设置(Multi-value parameter)
多值请求参数的意思就是每一个参数名称对应于一个或者多个值(也就是说,一个参数名称的值是一个list集合),我们可以使用 var-args 的形式来表示:
given().param("myList", "value1", "value2"). ..
也可以使用list集合的形式来表示多值参数:
List<String> values = new ArrayList<String>();
values.add("value1");
values.add("value2"); given().param("myList", values). ..
2.无值请求参数(No-value parameter)
我们可以指定一个没有值的查询参数、表单参数以及请求等:
given().param("paramName"). ..
3.路径参数(Path parameters)
在我们的请求当中,我们也可以指定路径请求参数:
post("/reserve/{hotelId}/{roomNumber}", "My Hotel", 23);
在rest-assured中这些类型的路径请求参数都被称之为“未命名路径参数”,因为它们是基于索引的(hoteId 将会等于"My Hotel",因为它是第一个占位符)。
我们也可以使用已命名的路径参数:
given().
pathParam("hotelId", "My Hotel").
pathParam("roomNumber", 23).
when().
post("/reserve/{hotelId}/{roomNumber}").
then().
..
路径请求参数使用请求的URL更易读,同时也使得请求路径在很多需要不同参数值的测试用例当中更加容易重复使用。
rest-assured的2.8.0版本以后,我们还可以混合使用 未命名路径参数和命名路径参数:
given().
pathParam("hotelId", "My Hotel").
when().
post("/reserve/{hotelId}/{roomNumber}", 23).
then().
..
在这里 roomNumber 的值等于23.
需要注意的是,指定过少或过多的请求将会导致错误信息的出现。我们可以使用过滤器来实现更加高级的测试用例,比如新增(add)、更改(change)、删除(remove,一些冗余的路径参数)。
4.Multi-part 表单数据
当我们传送大容量的数据到服务端时,我们通常使用 multipart 表单数据技术。rest-assured提供了一个叫做 multiPart 的方法可以让我们指定文件(file)、字节数组(byte-array)、输入流或者是上传文件。在最简单的表单中,我们可以通过下面的方法来上传文件:
given().
multiPart(new File("/path/to/file")).
when().
post("/upload");
它将会承担一个叫做"file"的控制器。在HTML中,这个控制器的名字就是input标签的属性名。让我们来看一下下面的HTML表单:
<form id="uploadForm" action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="file" size="40">
<input type=submit value="Upload!">
</form>
在这个例子当中,控制器的名字就是一个名为"file"的input标签。如果我们有不一样的控制器名称,我们需要指定它:
given().
multiPart("controlName", new File("/path/to/file")).
when().
post("/upload");
当然也可以在一个请求当中提供多个"multi-part"实体:
byte[] someData = ..
given().
multiPart("controlName1", new File("/path/to/file")).
multiPart("controlName2", "my_file_name.txt", someData).
multiPart("controlName3", someJavaObject, "application/json").
when().
post("/upload");
我们还可以使用 MultiPartSpecBuilder 来使用一些更高级的用法:
Greeting greeting = new Greeting();
greeting.setFirstName("John");
greeting.setLastName("Doe"); given().
multiPart(new MultiPartSpecBuilder(greeting, ObjectMapperType.JACKSON_2)
.fileName("greeting.json")
.controlName("text")
.mimeType("application/vnd.custom+json").build()).
when().
post("/multipart/json").
then().
statusCode(200);
我们还可以通过使用 MultiPartConfig 来指定默认的 control-name 和 文件名,比如:
given().config(config().multiPartConfig(multiPartConfig().defaultControlName("something-else"))). ..
这将会配置控制器的名字为"something-else",而不是" file "。
三、cookies设置:
在最简单的form表单中我们可以指定cookies,这样做:
given().cookie("username", "John").when().get("/cookie").then().body(equalTo("username"));
我们也可以指定一个多值的cookie,如下:
given().cookie("cookieName", "value1", "value2"). ..
上面的写法将会创建两个cookies,cookieName=value1 和 cookieName=value2 。
我们还可以通过下面的方式来指定一个详细的cookie :
Cookie someCookie = new Cookie.Builder("some_cookie", "some_value").setSecured(true).setComment("some comment").build();
given().cookie(someCookie).when().get("/cookie").then().assertThat().body(equalTo("x"));
或者是同时指定多个具有详细信息的cookies :
Cookie cookie1 = Cookie.Builder("username", "John").setComment("comment 1").build();
Cookie cookie2 = Cookie.Builder("token", 1234).setComment("comment 2").build();
Cookies cookies = new Cookies(cookie1, cookie2);
given().cookies(cookies).when().get("/cookie").then().body(equalTo("username, token"));
四、请求头设置
given().header("MyHeader", "Something").and(). ..
given().headers("MyHeader", "Something", "MyOtherHeader", "SomethingElse").and(). ..
同样,我们也可以指定多值的header :
given().header("headerName", "value1", "value2"). ..
这里也会创建两个headers,headerName=value1 和 headerName=value2 .
1.头部合并/覆盖
默认情况下,头部是会被合并(merged)的,所以假如你这样写:
given().header("x", "1").header("x", "2"). ..
请求将会包含两个头部,"x:1" 和 "x:2"。我们也可以在 HeaderConfig 的基础上修改它为一个 header :
given().
config(RestAssuredConfig.config().headerConfig(headerConfig().overwriteHeadersWithName("x"))).
header("x", "1").
header("x", "2").
when().
get("/something").
...
这样的话,就只有一个 header,"x:2"会被发送到服务端。
五、Content-Type的设置
given().contentType(ContentType.TEXT). ..
given().contentType("application/json"). ..
六、请求体(Request Body)的设置
// 作用于POST, PUT and DELETE 请求
given().body("some body"). ..
//更明确的 (可选择)
given().request().body("some body"). ..
// 作用于POST, PUT and DELETE请求
given().body(new byte[]{42}). ..
//更明确的(可选择)
given().request().body(new byte[]{42}). ..
我们也可以序列化一个Java对象为JSON 或 XML,具体参考对象映射。
rest-assured之如何指定请求数据(Specifying Request Data 包括请求参数、请求头、cookie等)的更多相关文章
- 基于小程序请求接口 wx.request 封装的类 axios 请求
基于小程序请求接口 wx.request 封装的类 axios 请求 Introduction wx.request 的配置.axios 的调用方式 源码戳我 feature 支持 wx.reques ...
- yii学习笔记(4),获取请求数据的request组件
yii在控制器中获取请求数据需要通过request组件来完成 <?php namespace app\controllers; use yii; use yii\web\Controller; ...
- axios请求拦截器(修改Data上的参数 ==>把data上的参数转为FormData)
let instance = axios.create({ baseURL: 'http://msmtest.ishare-go.com', //请求基地址 // timeout: 3000,//请求 ...
- angularjs 请求数据转换为Form Data传参
在angularjs中配置好服务,有时传参会导致后台借不到值或者后台直接报错: 这就与后台框架有关,如果后台是以public ModelAndView接收接口传过来的参数,这种情况,前台传参的形式比较 ...
- requests库的get请求(加上head,加上get参数请求)
#coding:utf-8 # 导入requests import requests # 构建url url = 'http://www.baidu.com' # 发送请求,获取响应 # respon ...
- Postman-----将 A 请求中 response Body 中的参数值传入到下一个请求 B 的 request body 中作为参数发送请求
问题:将A接口中response body的"id"传入到B接口的request body中. 解决办法: 1.在A接口的test中设置环境变量. 代码:var data = JS ...
- 速战速决 (6) - PHP: 获取 http 请求数据, 获取 get 数据 和 post 数据, json 字符串与对象之间的相互转换
[源码下载] 速战速决 (6) - PHP: 获取 http 请求数据, 获取 get 数据 和 post 数据, json 字符串与对象之间的相互转换 作者:webabcd 介绍速战速决 之 PHP ...
- jQuery的deferred对象使用详解——实现ajax线性请求数据
最近遇到一个ajax请求数据的问题 ,就是想要请求3个不同的接口,然后请求完毕后对数据进行操作,主要问题就是不知道这3个请求誰先返回来,或者是在进行操作的时候不能保证数据都已经回来,首先想到能完成的就 ...
- http请求数据的格式
最近看了tinyhttpd的服务器代理,看了看http请求数据包的格式和内容 http请求报包含三个部分: 请求行 + 请求头 + 数据体 请求行包含三个内容 method + request-URI ...
随机推荐
- 工作流系统webservice服务
http://blog.csdn.net/zhengzhb/article/details/7477616
- myeclipse工程中library 和 web-inf下lib的区别
eclipse工程下的library是用来编译里面的src中java文件的实际发布到tomcat时,仅仅只复制了WEB-INF/lib里面的jar包,所以出现eclipse可以正常编译但tomcat运 ...
- 实践作业3:白盒测试----了解JunitDAY9.
我觉得整个白盒测试过程中,最大的难点就是学习Junit和使用它进行测试.我们组安排了两个同学一起完成这部分工作.因为这个工具之前从来没有接触过,因此需要从头开始自学.找到好的教程其实可以事半功倍,我找 ...
- Web测试实践-任务进度-Day02
小组成员 华同学.郭同学.覃同学.刘同学.穆同学.沈同学 任务进度 在经过任务分配阶段后,大家都投入到了各自的任务中,以下是大家今天任务的进度情况汇总. 华同学 & 刘同学(任务1) 1.对爱 ...
- Yii2 修改 breadcrumb 首页图标
<?=Breadcrumbs::widget([ 'homeLink' => [ 'label' => '<i class="fa fa-home"> ...
- 32 取一个整数a从右端开始的4-7位
题目:取一个整数a从右端开始的4-7位 public class _032FetchDigit { public static void main(String[] args) { fetchDigi ...
- Java中BufferedReader和scanner的对比
Scanner 和BufferedReader同样能实现将键盘输入的数据送入程序, import java.io.*;import java.util.Scanner;public class C { ...
- 浅谈https\ssl\数字证书
全球可信的SSL数字证书申请:http://www.shuzizhengshu.com 在互联网安全通信方式上,目前用的最多的就是https配合ssl和数字证书来保证传输和认证安全了.本文追本溯源围绕 ...
- Altera SOPC FrameBuffer系统设计教程
Altera SOPC FrameBuffer系统设计教程 小梅哥编写,未经授权,严禁转载或用于任何商业用途 在嵌入式系统中,LCD屏作为最友好的人机交互方式,被大量的应用到了各个系统中.在基于ARM ...
- getTextContent()方法会出现The method getTextContent() is undefined for the type Node 提示
eclipse 中 如果加入了 其他了xfire 等其他xml解析包的话,使用org.w3c.dom.Node下的getTextContent()方法会出现The method getTextCont ...