月关 2月15日
rest-assured
对 response
结果的导出
上一篇文章中介绍了 rest-assured
对返回结果的断言,最后说明了对于Response结果导出的需求。可查看往期文章进行查看。
这里将继续研究 rest-assured
对 response
结果的导出获取,现有一个登录接口 auth/oauth/token
,接口的部分返回值如下:
HTTP/1.1 200 OK
Server: nginx/1.12.2
Date: Mon, 13 Jan 2020 02:15:11 GMT
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Expires: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
X-XSS-Protection: 1; mode=block
Pragma: no-cache
X-Frame-Options: DENY
X-Content-Type-Options: nosniff
Proxy-Connection: keep-alive
{
"code": 1,
"msg": null,
"data": {
"tenant_id": 6,
"userType": "1",
"dept_id": 0,
"user_id": 6,
"username": "xxx",
"jti": "afeb93f8-e4e4-4c15-955b-90cee130c4c7",
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.exxxzciLCJjbGllbnRfaWQiOiJzeXN0ZW0iLCJ1c2VybmFtZSI6InFpbnpoZW4ifQ.6NQmjJp_9XSveOaATNLjtTktWe6_WjHY0o9NbBUdDx8",
"expires_in": 9999999,
"token_type": "bearer"
}
...
}
语法演示
extract().path()
extract
是我们获取返回值的核心,通过它来指明后面需要获取的内容, path()
中的语法同断言时的 JsonPath
一致,例如我们现在要获取 user_id
,写法如下:
@Test
void login(){
.. .
when()
.log().all().post("http://47.xxx.xxx.133/auth/oauth/token").
then()
.log().all().statusCode(200).body("code",equalTo(1))
.extract().path("data.user_id");
System.out.println("返回id的值是:"+id);
}
运行结果:
extract().asString()
有时候我们可能需要获取 ResponseBody
中的多个值,例如我们现在想要获取返回体 body
中的 dept_id
和 user_id
,我们就可以利用 extract().asString()
先将响应结果以 json
字符串的形式保存下来,再一一根据需要获取,具体写法如下:
@Test
void login(){
.. .
when()
.log().all().post("http://47.xxx.xxx.133/auth/oauth/token").
then()
.log().all().statusCode(200).body("code",equalTo(1))
.extract().asString();
System.out.println("返回body的值是:"+json);
System.out.println("获取user_id的值是:"+ from(json).get("data.user_id"));
System.out.println("获取dept_id的值是:"+ from(json).get("data.dept_id"));
}
运行结果:
注:这里用到的from是rest-assured的,不要导错包了:import static io.restassured.path.json.JsonPath.from;
extract().response()
上面都是对响应体的结果进行导出,但是实际工作中我们的需求远不止于此,我们可能还需要响应头等信息,例如一些接口的 Token
、就可能会在响应信息的 Header
中返回;
这个时候就可以利用 extract().response()
来讲所有的 response
信息都保存成一个 Response
对象:
@Test
void login(){
.. .
when()
.log().all().post("http://47.xxx.xxx.133/auth/oauth/token").
then()
.log().all().statusCode(200).body("code",equalTo(1))
.extract().response();
System.out.println("返回response是:"+response);
}
运行结果:
然后在利用各种 Response.get
方法来获取。
1)获取所有的 Headers
@Test
void login(){
.. .
when()
.log().all().post("http://47.xxx.xxx.133/auth/oauth/token").
then()
.log().all().statusCode(200).body("code",equalTo(1))
.extract().response();
System.out.println("返回headers是:\n"+response.getHeaders());
}
运行结果:
2)获取某一个 header
值
类似 key
, value
的结构,使用 getHeader("headerName")
即可,例如我们这里要获取 Content-type
的值:
@Test
void login(){
.. .
when()
.log().all().post("http://47.xxx.xxx.133/auth/oauth/token").
then()
.log().all().statusCode(200).body("code",equalTo(1))
.extract().response();
System.out.println("返回Content-Type是:\n"+response.getHeader("Content-Type"));
}
运行结果:
3)获取status line——getStatusLine()
@Test
void login(){
.. .
when()
.log().all().post("http://47.xxx.xxx.133/auth/oauth/token").
then()
.log().all().statusCode(200).body("code",equalTo(1))
.extract().response();
System.out.println("返回StatusLine是:\n"+response.getStatusLine());
}
运行结果:
4)获取status code——getStatusCode()
@Test
void login(){
.. .
when()
.log().all().post("http://47.xxx.xxx.133/auth/oauth/token").
then()
.log().all().statusCode(200).body("code",equalTo(1))
.extract().response();
System.out.println("返回StatusCode是:\n"+response.getStatusCode());
}
运行结果:
5)获取cookies——getCookies()、getCookie(“cookieName”)
rest-assured还为我们提供了方便的获取cookie的方法;因本例中无cookies返回,所以仅展示代码语法,有需要的可自行测试或参考官方文档
// Get all cookies as simple name-value pairs
Map<String, String> allCookies = response.getCookies();
// Get a single cookie value:
String cookieValue = response.getCookie("cookieName");
上述这些已几乎可满足日常工作所需,如有需要可在官网进一步研究,官网还提供了获取同名多值的 header
和 cookie
等方法:
相关参考链接:
RESTAssured 官方文档:
https://github.com/rest-assured/rest-assured/wiki/Usage