Как извлечь sessionId из Citrus HttpRequest

Я попытался протестировать набор REST-сервисов с помощью Citrus Java DSL. После аутентификации службы ожидают тот же действительный идентификатор сеанса первого запроса. На стороне сервера я вижу, что существует случайный идентификатор сеанса, но при втором запросе идентификатор сеанса равен нулю. Я попытался установить для handleCookies значение true в конфигурации конечной точки и попытался извлечь некоторую информацию заголовка (set-cookie), но безуспешно. EndpointConfiguration повторно используется во время различных запросов.

CitrusEndpoints.http()
   .client()
   .handleCookies(true)

Как я могу заставить конечную точку повторно использовать согласованный идентификатор сеанса или как я могу извлечь его из запроса / ответа?

Заранее благодарим за любые идеи и подсказки.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
351
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ответ на ваш 1-й запрос должен иметь установленный заголовок

Set-Cookie: JSESSIONID=ABCDEFG;path=/api/foo

Вы можете извлечь эту информацию в своей операции получения

http()
    .client(todoClient)
    .receive()
    .response(HttpStatus.OK)
    .extractFromHeader("Set-Cookie", "cookie")
    .payload("{ \"foo\": \"bar\" }");

После этого мы должны обработать новое значение ${cookie}, чтобы извлечь фактическое имя и значение идентификатора сеанса в новую переменную ${sessionId}.

createVariable("sessionId", "citrus:substringBefore(${cookie}, ';')");

Теперь у нас есть переменная ${sessionId}, которая содержит только имя и значение идентификатора сеанса - в нашем примере это JSESSIONID=ABCDEFG.

В дальнейших запросах вы можете использовать переменную для установки правильной информации заголовка Cookie.

http()
    .client(todoClient)
    .send()
    .get("/api/foo")
    .header("Cookie", "${sessionId}")
    .accept(ContentType.APPLICATION_JSON.getMimeType());

Спасибо, Кристоф, попробовал, но не вышло. После некоторого дополнительного тестирования, также вызывающего службы через браузер, кажется, что при использовании браузера JSESSIONID является частью заголовка запроса и не включается в ответ. Но когда я изменяю ваш код, чтобы извлечь cookie из запроса, Citrus всегда возвращает сообщение об ошибке, этот элемент заголовка не может быть найден в заголовке.

Patrick 10.04.2018 13:52

Это означает, что клиент создает идентификатор сеанса в самом первом запросе и должен продолжать его использовать? Если это так, вы можете просто создать значение переменной (используя функции randomString или randomUUID Citrus) и установить заголовок «Cookie» в первом и всех последующих запросах, как показано в последнем фрагменте кода моего ответа.

Christoph Deppisch 10.04.2018 14:59

Да, это была проблема. Я решил это с помощью специальной конфигурации, так что в случае сценариев тестирования интеграции сервер добавляет sessionId в заголовок ответа. Другой вопрос, основанный на первом: я видел, что можно использовать переменные Глобальный. При использовании фрагмента createVariable("sessionId", "citrus:substringBefore(${cookie}, ';')"); можно ли повторно использовать переменную идентификатор сессии между разными тестовыми примерами @CitrusTest?

Patrick 10.04.2018 17:36

Думаю, я нашел решение проблемы с переменной. При использовании TestRunner вместо TestDesigner я могу ввести TestContext. После вызова функции createVariable я могу получить переменную из контекст и добавить ее как globalVariable в контекст. Делая это таким образом, я могу читать глобальную переменную из контекста также в других методах TestCase. createVariable("sessionId", "citrus:substringBefore('${cookie}', ';')"); String jSessionId= context.getVariable("sessionId", String.class); context.getGlobalVariables().put("jSessionId", jSessionId);

Patrick 11.04.2018 08:38

Другие вопросы по теме