1. 程式人生 > >rest-assured之獲取響應數據(Getting Response Data)

rest-assured之獲取響應數據(Getting Response Data)

字節 led cookie值 有用 itl dom java 傳遞 解析器

  我們使用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)