REST Assured 23 - 用Java Map创建JSON Object Request Body

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值