REST Assured 系列汇总 之 REST Assured 23 - 用Java Map创建JSON Object Request Body
在前面系列《REST Assured 9 - 第一个POST Request》文中,有把JSON payload作为字符串处理,如果payload是动态的,或则说payload需要可参数化的,或是payload是需要运行时动态创建的,这不是好的实践方式。应该有一个更好的方式去创建payload,以此便于维护,管理,更新,从中获取值。
我们可以用java的Map创建一个JSON Object。一个JSON Object就是一个键值对,可以用Map很方便的创建。Java中Map也是表示键值对的集合。
让我们先从简单的JSON Object开始:
{
"username" : "admin",
"password" : "password123"
}
上面的JSON Object,包含2个键值对。“username” 和“password” 是两个键,“admin” 和 “password123”是对应键的值。
为了保持一致,我们需要创建一个Map,put上面的键值对,键和值都是string字符串类型,如下:
Map<String,String> authPayload = new HashMap<String,String>();
authPayload.put("username", "admin");
authPayload.put("password", "password123");
现在我们就可以直接传入Map object到这个重载的body()方法,接收Object类型。
完整代码:
import io.restassured.RestAssured;
import io.restassured.http.ContentType;
import org.junit.Test;
import java.util.HashMap;
import java.util.Map;
public class CreatingRequestBodyUsingMap {
@Test
public void passBodyAsMap(){
Map<String, String> authPayload = new HashMap<String, String>();
authPayload.put("username", "admin");
authPayload.put("password", "password123");
RestAssured.given()
.baseUri("https://restful-booker.herokuapp.com/auth")
.contentType(ContentType.JSON)
.body(authPayload)
.log()
.all()
.when()
.post()
.then()
.assertThat()
.statusCode(200)
.log()
.all();
}
}
用一个logger来显示JSON body和相关的信息,输出如下:
Request method: POST
Request URI: https://restful-booker.herokuapp.com/auth
Proxy: <none>
Request params: <none>
Query params: <none>
Form params: <none>
Path params: <none>
Headers: Accept=*/*
Content-Type=application/json
Cookies: <none>
Multiparts: <none>
Body:
{
"password": "password123",
"username": "admin"
}
HTTP/1.1 200 OK
Server: Cowboy
Connection: keep-alive
X-Powered-By: Express
Content-Type: application/json; charset=utf-8
Content-Length: 27
Etag: W/"1b-jhW4D4cgQlKsRV91fIm43fQZuSY"
Date: Sun, 22 Aug 2021 09:04:47 GMT
Via: 1.1 vegur
{
"token": "80564d395331226"
}
Process finished with exit code 0
上面我们看到一个非常基本的JSNON Object body,接下来我们实践一下更复杂的JSON Object body。
{
"firstname" : "Jim",
"lastname" : "Brown",
"totalprice" : 111,
"depositpaid" : true,
"bookingdates" : {
"checkin" : "2021-01-01",
"checkout" : "2021-01-01"
},
"additionalneeds" : "Breakfast"
}
一个JSON Objet可以包含另外一个JSON Object,前面的例子我们创建了一个普通的Map<String, String>,现在我们需要创建一个Map<String, Object>,这样允许Map里的key有一个JSON Object的值。
Map<String,Object> jsonBodyUsingMap = new HashMap<String,Object>();
jsonBodyUsingMap.put("firstname", "Jim");
jsonBodyUsingMap.put("lastname", "Brown");
jsonBodyUsingMap.put("totalprice", 111);
jsonBodyUsingMap.put("depositpaid", true);
Map<String,String> bookingDatesMap = new HashMap<>();
bookingDatesMap.put("checkin", "2021-01-01");
bookingDatesMap.put("checkout", "2021-07-01");
jsonBodyUsingMap.put("bookingdates", bookingDatesMap);
jsonBodyUsingMap.put("additionalneeds", "Breakfast");
完整的代码:
import org.junit.Test;
import io.restassured.RestAssured;
import io.restassured.http.ContentType;
import java.util.HashMap;
import java.util.Map;
public class CreatingNestedJsonObject {
@Test
public void CreatingNestedJsonObjectTest(){
Map<String, Object> jsonBodyUsingMap = new HashMap<String, Object>();
jsonBodyUsingMap.put("firstname", "Jim");
jsonBodyUsingMap.put("lastname", "Brown");
jsonBodyUsingMap.put("totalprice", 111);
jsonBodyUsingMap.put("depositpaid", true);
Map<String, String> bookingDatesMap = new HashMap<String, String>();
bookingDatesMap.put("checkin", "2021-01-01");
bookingDatesMap.put("checkout", "2021-07-01");
jsonBodyUsingMap.put("bookingdates", bookingDatesMap);
jsonBodyUsingMap.put("additionalneeds", "Breakfast");
//GIVEN
RestAssured
.given()
.baseUri("https://restful-booker.herokuapp.com/booking")
.contentType(ContentType.JSON)
.body(jsonBodyUsingMap)
.log()
.all()
// WHEN
.when()
.post()
// THEN
.then()
.assertThat()
.statusCode(200)
.log()
.all();
}
}
输出:
Request method: POST
Request URI: https://restful-booker.herokuapp.com/booking
Proxy: <none>
Request params: <none>
Query params: <none>
Form params: <none>
Path params: <none>
Headers: Accept=*/*
Content-Type=application/json
Cookies: <none>
Multiparts: <none>
Body:
{
"firstname": "Jim",
"additionalneeds": "Breakfast",
"bookingdates": {
"checkin": "2021-01-01",
"checkout": "2021-07-01"
},
"totalprice": 111,
"depositpaid": true,
"lastname": "Brown"
}
HTTP/1.1 200 OK
Server: Cowboy
Connection: keep-alive
X-Powered-By: Express
Content-Type: application/json; charset=utf-8
Content-Length: 195
Etag: W/"c3-6qkY6ihHMj2uanlL3VpXScsLC8A"
Date: Sun, 22 Aug 2021 11:23:17 GMT
Via: 1.1 vegur
{
"bookingid": 34,
"booking": {
"firstname": "Jim",
"lastname": "Brown",
"totalprice": 111,
"depositpaid": true,
"bookingdates": {
"checkin": "2021-01-01",
"checkout": "2021-07-01"
},
"additionalneeds": "Breakfast"
}
}
Process finished with exit code 0