Я пытаюсь использовать Wink RestClient для функционального тестирования на конечной точке службы Rest. Я использую mocks для модульного тестирования, но я бы хотел функционально протестировать его как конечного потребителя.Apache Wink Client - проверка службы REST с использованием формы auth
Я понимаю, что некоторые из них возражают против того, что я называю это конечной точкой REST при использовании auth на основе формы, но это текущая архитектура, которую я имею.
Большинство ресурсов, которые я хочу протестировать, являются защищенными ресурсами, а приложение (работает на Tomcat6) защищено путем проверки подлинности формы. (как в следующем фрагменте web.xml).
До сих пор я пытался сделать первый вызов незащищенного ресурса, чтобы получить заголовок set-cookie, содержащий JSESSIONID, и использовать этот JSESSIONID в заголовке (через Resource.cookie()) в последующие запросы, но это не приносит плодов.
web.xml
<login-config>
<auth-method>FORM</auth-method>
<form-login-config>
<form-login-page>/login.html</form-login-page>
<form-error-page>/login.html?failure=true</form-error-page>
</form-login-config>
</login-config>
My Wink Код RestClient выглядит, как показано ниже. Все ответы - 200, но две вещи, которые я замечаю, - это то, что ответ от вызова/j_security_check/не включает файл cookie jsessionid, а вызов защищенного ресурса говорит о том, что у меня произошел сбой. Полезная нагрузка для вызова функции j_security_check была зафиксирована непосредственно из предыдущего успешного запроса браузера.
ClientConfig config = new ClientConfig();
config.setBypassHostnameVerification(true);
RestClient restClient = new RestClient(config);
Resource unprotectedResource = restClient.resource(BASE_URL + "/");
unprotectedResource.header("Accept", "*/*");
ClientResponse clientResponse = unprotectedResource.get();
String response = clientResponse.getEntity(String.class);
// get jSession ID
String jSessionId = clientResponse.getHeaders().get("set-cookie").get(0);
jSessionId = jSessionId.split(";")[0];
System.out.println(jSessionId);
// create a request to login via j_security_check
Resource loginResource = restClient.resource(BASE_URL + "/j_security_check/");
loginResource.accept("text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
loginResource.header("referer", "http://localhost:8080/contextroot/");
loginResource.cookie(jSessionId);
loginResource.header("Connection", "keep-alive");
loginResource.header("Content-Type", "application/x-www-form-urlencoded");
loginResource.header("Content-Length", "41");
ClientResponse loginResponse = loginResource.post("j_username=*****&j_password=*************");
/* the loginResponse, as this point, does not have the jsessionid cookie, my browser client does */
Resource protectedResource = restClient.resource(BASE_URL + "/protected/test/");
systemResource.accept("application/json");
systemResource.cookie(jSessionId);
ClientResponse systemResponse = systemResource.get();
response = clientResponse.getEntity(String.class);
System.out.println(response);
Любых мысли или опыт использования моргания RestClient осуществлять формы-AUTH защищенных ресурсов был бы весьма признателен. Я предполагаю, что я буду использовать другие фреймворки, я слышал об REST-Assured и других, но поскольку приложение использует Wink, и RestClient, кажется, предоставляет мне то, что мне нужно, я решил, что буду придерживаться его.
Оказывается j_security_check реагирует с [# 302 Временно перемещено] - Когда я перехватывать запрос с помощью сниффера и добавление cookie JSESSIONID к этому перенаправленному запросу, все в порядке. Проблема в том, что я не могу понять, что из объекта объекта RestClient объекта (или ресурса или ответа). Переадресация происходит за кулисами. Кто-нибудь знает, как проинструктировать метод Resource.post() STOP при перенаправлении или ClientResponse, чтобы уловить перенаправление? Я еще не вижу пути. – rogodeter