RestAssured: аннотация определяет, как сериализовать content-type application / x-www-form-urlencoded. Как создать запрос со структурой ключ / значение?

У меня есть следующая postman коллекция:

{
    "info": {
        "_postman_id": "b172f7d9-xxxxxxx",
        "name": "protection",
        "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
    },
    "item": [
        {
            "name": "protection-example_IP ONLY",
            "request": {
                "method": "POST",
                "header": [
                    {
                        "key": "Content-Type",
                        "value": "application/x-www-form-urlencoded"
                    }
                ],
                "body": {
                    "mode": "urlencoded",
                    "urlencoded": [
                        {
                            "key": "ApiKey",
                            "value": "62fdc812-be58-xxxxx",
                            "type": "text"
                        },
                        {
                            "key": "TagId",
                            "value": "1111",
                            "type": "text"
                        },
                        {
                            "key": "ClientIP",
                            "value": "200.55.111.111",
                            "type": "text"
                        },
                        {
                            "key": "RequestURL",
                            "value": "http://awesomeSite.com",
                            "type": "text"
                        },
                        {
                            "key": "ResourceType",
                            "value": "text/html",
                            "type": "text"
                        },
                        {
                            "key": "Method",
                            "value": "GET",
                            "type": "text"
                        },
                        {
                            "key": "Host",
                            "value": "awesomeSite.com",
                            "type": "text"
                        },
                        {
                            "key": "UserAgent",
                            "value": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36",
                            "type": "text"
                        },
                        {
                            "key": "Accept",
                            "value": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
                            "type": "text"
                        },
                        {
                            "key": "AcceptLanguage",
                            "value": "en-IL,en-US;q=0.9,en;q=0.8,my;q=0.7",
                            "type": "text"
                        },
                        {
                            "key": "AcceptEncoding",
                            "value": "gzip, deflate, br",
                            "type": "text"
                        },
                        {
                            "key": "HeaderNames",
                            "value": "Host,User-Agent,Accept,Accept-Langauge,Accept-Encoding,Cookie",
                            "type": "text"
                        }
                    ]
                },
                "url": {
                    "raw": "https://other.awesome.com/test-api",
                    "protocol": "https",
                    "host": [
                        "other",
                        "awesome",
                        "com"
                    ],
                    "path": [
                        "test-api"
                    ]
                }
            },
            "response": []
        },
    //.........

Мне нужно создать такой же запрос, используя rest-assured framework,

Я попытался создать карту с ключами / значением и поместить ее в тело:

 Map<String,String> keys = new HashMap<String, String>(){{
            put("ApiKey", "62fdc812-be58-xxxxxx");
            put("TagId", "1111");
            //...
 }};

RestAssured.given()
                .contentType("application/x-www-form-urlencoded")
                .body(keys)
                .when().post("https://other.awesome.com/test-api")
                .then()
                .statusCode(200);

Но получил ошибку:

java.lang.IllegalArgumentException: невозможно сериализовать, потому что не удается определить, как сериализовать приложение типа содержимого / x-www-form-urlencoded.

В случае, когда я использую formParams вместо body:

RestAssured.given()
                .log().all()
                .formParams(keys)
                .when().post("https://other.awesome.com/test-api")
                .then()
                .statusCode(200);

Я получаю следующую ошибку:

Expected status code <200> doesn't match actual status code <415>
HTTP/1.1 415 Unsupported Media Type
Content-Length: 149
Content-Security-Policy: default-src 'none'
Content-Type: text/html; charset=utf-8
Date: Tue, 05 Jan 2021 09:50:12 GMT
X-Content-Type-Options: nosniff

<html lang="en">
  <head>
    <meta charset="utf-8"/>
    <title>Error</title>
  </head>
  <body>
    <pre>Unsupported Media Type</pre>
  </body>
</html>

Как правильно построить запрос с Rest Assured для этого шаблона?


  • Дополнительная информация:

В PostMan запросе содержится key/value карта, в body. Вкладка Params пуста. Но в коде во втором случае у меня нет данных в разделе body:

  • Почтальон:

введите описание изображения здесь

  • Журналы кода:

введите описание изображения здесь


person Valentyn Hruzytskyi    schedule 04.01.2021    source источник
comment
Проголосовать за аккуратное редактирование (Y)   -  person Wilfred Clement    schedule 05.01.2021


Ответы (1)


Вы почти у цели,

Карта:

Map<String, String> keys = new HashMap<String, String>() {
            {
                put("ApiKey", "62fdc812-be58-xxxxxx");
                put("TagId", "1111");
            }
        };

Гарантированный код:

RestAssured.given().formParams(keys).when().post("https://other.awesome.com/test-api").then()
                .statusCode(200);

Rest Assured автоматически устанавливает Content-Type как application/x-www-form-urlencoded, когда вы используете formParams()

Обновление:

Я предполагаю, что вы получаете Unsupported Media Type, потому что Rest Assured устанавливает кодировку по умолчанию в запросе для Content-Type

введите описание изображения здесь

Попробуйте использовать приведенный ниже код

RestAssured.given().log().all()
                .config(RestAssured.config()
                        .encoderConfig(encoderConfig().appendDefaultContentCharsetToContentTypeIfUndefined(false)))
                .formParams(keys).when().post("https://other.awesome.com/test-api").then().statusCode(200);

Вам нужно импортировать encoderConfig как статический

import static io.restassured.config.EncoderConfig.encoderConfig;

Перейдите по этой ссылке для получения дополнительной информации о encoderConfig.

Если у вас все еще есть проблемы, из POSTMAN выполните следующие действия.

введите описание изображения здесь

Добавьте .log().all() после given() в свой код Rest Assured и сравните результаты

person Wilfred Clement    schedule 04.01.2021
comment
Спасибо. Но тоже не работают. Теперь у меня ошибка 415: неподдерживаемый тип носителя - коды состояния. - person Valentyn Hruzytskyi; 05.01.2021
comment
Я обновил ответ, проверьте - person Wilfred Clement; 05.01.2021
comment
Большое спасибо. Но 403 Forbidden сейчас. - person Valentyn Hruzytskyi; 05.01.2021
comment
403 из-за авторизации, проверьте значение apiKey и другие данные - person Wilfred Clement; 05.01.2021
comment
Как оказалось - сервис имеет настройки защиты и запрещает доступ на 10 минут, если отправлялся неверный запрос. Так что ваше обновление работает хорошо. Большое спасибо! - person Valentyn Hruzytskyi; 05.01.2021