Я пытаюсь использовать Wink RestClient для функционального тестирования конечной точки службы Rest. Я использую макеты для модульного тестирования, но я хотел бы функционально протестировать его в качестве потребителя конечной точки.
Я понимаю, что некоторые будут возражать против того, чтобы я называл это конечной точкой REST при использовании аутентификации на основе форм, но это текущая архитектура, которая у меня есть.
Большинство ресурсов, которые я хочу протестировать, являются защищенными ресурсами, а приложение (работающее на 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>
Мой код 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);
Будем очень признательны за любые мысли или опыт использования Wink RestClient для использования ресурсов, защищенных с помощью формы. Я полагаю, что я бы развлекался с другими фреймворками, я слышал о REST-Assured и других, но поскольку приложение использует Wink, а RestClient, похоже, предоставляет мне то, что мне нужно, я решил, что буду придерживаться его.