Как сделать редирект на location который приходит в HTTP респонсе RestAssured?

Добрый день!
Юзаю rest-assured.

делаю так:

given().params(params).when().post("/path/to/service");

и получаю такой HTTP ответ:

HTTP/1.1 302 Found
...
Location: http://тут_урл_редирект

<html>
   <body/>
</html>

Как мне сделать так, чтобы на этот location отправить post() автоматически?

Если я делаю так:


Response response = given().params(params).when().post("/path/to/service");

String location = response.getHeader("Location");

given().when().post(location);

то получаю точно такой же ответ:

HTTP/1.1 302 Found
...
Location: http://тут_урл_редирект

<html>
   <body/>
</html>

Тут вроде что-то написано по этому поводу:

1 лайк

Эту документацию я, конечно же, читал =)

Пробовал делать так:

RestAssured.config = config().redirect(redirectConfig().followRedirects(true).and().maxRedirects(10));

и так:

given().config(RestAssured.config().redirect(redirectConfig().followRedirects(true)));

и так далее и тому подобное, но пока безрезультатно…

Вбил “rest-assured redirect” и открыл первую ссылку на stack overflow - http - JAVA Rest-Assured DSL redirects not working - Stack Overflow .

The above link explains that POST/PUT should get a response of a 303 instead of 302, and since I am getting a 302 on a PUT, rest assured does not support redirects for that. If I do GET and receive a 302, all is well.

2 лайка

The above link explains that POST/PUT should get a response of a 303 instead of 302, and since I am getting a 302 on a PUT, rest assured does not support redirects for that. If I do GET and receive a 302, all is well.

Это что получается, баг в rest-assured?

Почему баг ? Это взято из спецификации HTTP клиента. По этому, если вы хотите что бы ваш тест заработал, то ваш сервис на этот POST request должен возвращать 303 , а не 302. Или же нужно тип этого запроса поменять на GET - не знаю что вам больше подходит.

2 лайка

Проверяйте статус + урл, если хотите забирайте урл, и проверяйте. Зачем вам редирект то вообще? Этим занимается клиент. Мы же не клиент тестируем.

1 лайк

Мне надо проверить xml, который пришел бы мне по редиректу на location.

Забирайте url и переходите. Но вообще странная реализация.

1 лайк

Я искал определленый токен (“at”) в ответе таким способом

private Response findToken(Response response) {
        while (response.cookie("at") == null) {
            logger.logResponse(response, "Find Token");

            cookies = mergeCookies(cookies, response.detailedCookies());
            String url = response.then().extract().header("Location");
            if (url == null) {
                logger.error("Url for parse is null.");
                throw new IllegalStateException("Url for parse is null.");
            }
            Map<String, String> params = parseParamsFromUrl(url);


            response = with().spec(new RequestSpecBuilder()
                    .setBaseUri(url)
                    .addParams(params)
                    .setConfig(RestAssuredConfig.newConfig().redirect(RedirectConfig.redirectConfig().followRedirects(false)))
                    .addCookies(cookies)
                    .addHeader(HttpHeaders.ACCEPT, "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
                    .build())
                    .get();
        }
        return response;
    }

Выдирал из ответа Location куда нас перенаправляют, делал merge куки (прокидывал куки от запроса к запросу) составлял новый запрос с нужными хедерами, посылал его и далее по кругу, пока не выполнится условие, у меня это занимало порядка 5 проходов по циклу.
А отказался от нативных редиретов, потому что, если вместе с редиректом приходит какая-то инфа, то ты ее просто теряешь, потому что на выходе у тебя лишь конечный response и нет возможности заглянуть в промежуточные.

3 лайка

How do you merge the cookies?

cookies = mergeCookies(cookies, response.detailedCookies());

все также интересно, что это за метод mergeCookies