json響應結果
Postman是做接口測試的,但是很多接口並不是直接就能測試的,需要一些預處理。比如登錄的時候,需要傳遞一個token。如果是網頁測試,一般打開登錄頁面的時候就會自動生成一個token,如果返回的是json格式,用Postman從中提取值很簡單的,在Test中輸入:
{
"access_token": "dda7b55f-574d-4de6-9f62-d849d5894ba9",
"token_type": "bearer",
"refresh_token": "1da3f4fb-dbf7-40d6-9316-32916f4c0d03",
"expires_in": 3599,
"scope": "READ WRITE"
}
如上要提取access_token的值,在Test中輸入:
//保存響應結果json
var jsonData = JSON.parse(responseBody);
//將響應結果中的access_token保存為全局變量hb_access_token
//最新版本pm環境變量設置使用方法
pm.globals.set("hb_access_token",jsonData.access_token);
上面的響應結果是json格式,如果響應結果是text格式的如何獲取返回值呢?
text響應結果
案例1
VZISsIhsksx3lHKksBE68sJ8NFlzZWNyZXRJZD1BS0lEbXRoeUxFNFFXMDVXWEhqNFN5RjBEdkpBbElPeHFyY3cmY3VycmVudFRpbWVTdGFtcD0xNTYxOTc5MTMzJmV4cGlyZVRpbWU9MTU2MjE1MTkzMyZyYW5kb209MzQ0MjkwOTEyJnByb2NlZHVyZT1oYi1tcDQtMjA=
如果是這種響應結果,那么獲取響應值如下:
pm.globals.set("hb_sign",pm.response.text())
如果響應的結果是html格式,那么怎么獲取其中需要的value呢?
案列2
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="utf-8" />
<title>Redmine</title>
<meta name="description" content="Redmine" />
<meta name="keywords" content="issue,bug,tracker" />
<meta name="csrf-param" content="authenticity_token" />
<meta name="csrf-token" content="UhYn8Ww03yLd1hNoliKSmU5uUZO33AmuxH+NQEqD3r2YCCdC64pmgmWOQNjyoAoki9MRJLosWAC0RX20+Th+gA==" />
<link rel='shortcut icon' href='/redmine/favicon.ico' />
<link rel="stylesheet" media="all" href="/redmine/stylesheets/jquery/jquery-ui-1.11.0.css" />
<link rel="stylesheet" media="all" href="/redmine/stylesheets/application.css" />
<script src="/redmine/javascripts/jquery-1.11.1-ui-1.11.0-ujs-3.1.3.js"></script>
<script src="/redmine/javascripts/application.js"></script>
<script>
如上,需要獲取csrf-token的值,可以使用以下操作:
var cs_token_temp = pm.response.text();
var cs_token_temp_01 = data01.match(/name="csrf-token" content="(.*?)"/)[1];
//match()里面的前后兩個反斜杠是必要的
pm.globals.set("cs_token", cs_token_temp_01);
console.log(pm.globals.get("cs_token"));
以上是使用正則表達式獲取token的值。網上還有另外一種操作方法:
//轉換XML body為JSON對象
var jsonObject = xml2Json(responseBody);
pm.globals.set("cs_token", jsonObject.html.head.meta[4].$.content);
可以使用pm.globals.set("getstring", JSON.stringify(jsonObject.html.head.meta));獲得html的分層信息。
但是在使用這個操作的時候,一直是提示html 沒有定義。查找postman的手冊也沒發現有什么特定的操作,不知道是不是收費版本才有的高級功能呢?
擴展
上面說到的json格式是簡單的{}形式,如果碰到復雜的如下:
{
"status": 1,
"message": "success",
"data": [
{
"id": 1,
"title": "鄉愁",
"author": "余光中",
"content": "小時候,鄉愁是一枚小小的郵票,我在這頭,母親在那頭。長大后,鄉愁是一張窄窄的船票,我在這頭,新娘在那頭"
},
{
"id": 5,
"title": "鄉愁",
"author": "余光中",
"content": "小時候,鄉愁是一枚小小的郵票,我在這頭,母親在那頭。長大后,鄉愁是一張窄窄的船票,我在這頭,新娘在那頭"
}
]
}
跟上面不同的是,data里面可能有多個json格式的數據,如果我們想斷言data里面第一個json應該如何斷言呢?其實也非常簡單,我們在tests輸入框中填寫:
var jsonData = JSON.parse(responseBody);
tests["Check respose status value"] = jsonData.status === 1;
pm.test("判斷data里面第一個json數據的id為1", function () {
var jsonData = pm.response.json();
pm.expect(jsonData.data[0].id).to.eql(1);
});