rest-assured之獲取響應數據(Getting Response Data)
我們使用rest-assured可以獲得響應內容,比如:我們發起一個get請求 get("/lotto") 並且獲得響應內容,我們有多種方式可以實現:
1 // 通過流的方式獲得響應內容,在使用完流之後千萬不能忘記關閉流 2 InputStream stream = get("/lotto").asInputStream(); 3 //通過字節數組的方式 4 byte[] byteArray = get("/lotto").asByteArray(); 5 //字符串 6 String json = get("/lotto").asString();
通過上面的方式我們就可以獲得整個響應內容,之前的文章中我們已經介紹過通過JsonPath和XMLPath的方式來獲得響應體中的某個值或者某個list,這裏就不再介紹這兩種方式了,下面來介紹幾種別的方式:
1.從已驗證的響應體中獲得值
我們可以使用 extract 方法來從一個已經驗證過的響應信息中提取某個值或者僅僅返回response本身的一個實例。這個方法是非常有用的,比如我們想將從響應信息中提取的值傳遞給後面的請求內容,就可以使用 extract 方法來實現。例如:下面的json會返回一個 title 的資源:
1 { 2 "title" : "My Title", 3 "_links": { 4 "self": { "href": "/title" }, 5 "next": { "href": "/title?page=2" }6 } 7 }
我們想驗證上面的Json的內容類型(content-type)是否是Json,並且 title 的值是否等於 "My Title",然後我們還想提取 next 字段的值並且用於下面的請求,那麽我們就可以這樣:
1 //斷言驗證,並且提取next的值,賦值給nextTitleLink 2 String nextTitleLink = 3 given(). 4 param("param_name", "param_value"). 5 when(). 6 get("/title"). 7 then(). 8 contentType(JSON).9 body("title", equalTo("My Title")). 10 extract(). 11 path("_links.next.href"); 12 13 //使用get方法獲取nextTitleLink的值 14 get(nextTitleLink). ..
如果我們想獲得多個值,我們也可以返回整個響應體(response):
1 //返回整個響應體 2 Response response = 3 given(). 4 param("param_name", "param_value"). 5 when(). 6 get("/title"). 7 then(). 8 contentType(JSON). 9 body("title", equalTo("My Title")). 10 extract(). 11 response(); 12 //取值 13 String nextTitleLink = response.path("_links.next.href"); 14 String headerValue = response.header("headerName");
2.獲取某個路徑下的值
如果只是想發起一個請求並且返回某個路徑下的值,這裏有一個簡單的方法:
1 int lottoId = get("/lotto").path("lotto.lottoid");
rest-assured會基於響應體的content-type自動決定是使用JsonPath還是使用XmlPath來解析響應數據,如果content-type沒有被定義,rest-assured會嘗試尋找默認的解析器。我們也可以通過設置手動決定使用哪一個解析器,可以選擇的解析器有xmlPath、jsonPath以及htmlPath,比如:
1 String firstName = post("/greetXML?firstName=John&lastName=Doe").andReturn().xmlPath().getString("firstName");
3.獲取頭部、cookies以及狀態等
我們可以通過下面的方法來header、cookies以及status:
1 Response response = get("/lotto"); 2 3 // 獲取所有的響應頭信息 4 Headers allHeaders = response.getHeaders(); 5 //獲取指定頭部的值 6 String headerName = response.getHeader("headerName"); 7 8 // 獲取所有cookies 9 Map<String, String> allCookies = response.getCookies(); 10 // 獲取指定cookie的值 11 String cookieValue = response.getCookie("cookieName"); 12 13 // 獲取狀態行 14 String statusLine = response.getStatusLine(); 15 // 獲取狀態碼 16 int statusCode = response.getStatusCode();
4.多值headers和cookies
同一個header和cookie可能會包含多個值
4.1 多值headers
要獲取同一個header的所有值,首先需要從 Response 對象中獲得 Headers 對象,然後從 Headers 實例中通過 Headers.getValues() 方法可以獲得所有的值(values),Header.getValues() 方法返回一個包含所有header值的List。
1 //首先獲得 response 對象 2 Response response = get("/lotto"); 3 4 //然後從response實例中獲得headers對象 5 Headers headers = response.getHeaders(); 6 7 //最後從headers對象中獲得包含所有cookies值的list 8 List<Object> values = headers.getValues();
4.2 多值cookies
要獲取同一個cookie的所有值,首先需要從 Response 對象中獲得 cookies 對象,然後從 cookiess 實例中通過 cookies.getValues() 方法可以獲得所有的值(values),cookies.getValues() 方法返回一個包含所有cookie值的List。
5.詳細Cookies
如果我們想要獲得cookie的路徑、過期時間等詳細信息,那我們就需要從rest-assured中獲得詳細的cookie。我們可以使用 Response.getDetailedCookie(java.lang.String) 方法來獲得詳細的cookie,這個cookie就包含了cookie的所有屬性。
也可以使用 Response.getDetailedCookies() 方法獲得所有cookie信息。
1 //獲得指定cookie名稱的cookie對象 2 Cookie cookie = response.getDetailedCookie("cookieName"); 3 //獲得cookie的Domain值 4 String domain = cookie.getDomain(); 5 //獲得cookie的有效時間 6 Date expiryDate =cookie.getExpiryDate(); 7 //獲得cookie的最大存活時間 8 int maxAge =cookie.getMaxAge(); 9 //獲得cookie的名稱 10 String name =cookie.getName(); 11 //獲得cookie的路徑 12 String path =cookie.getPath();
1 //獲得所有cookies的詳細信息 2 Cookies cookies = response.getDetailedCookies();
rest-assured之獲取響應數據(Getting Response Data)