Apache Wink Client - Test einen REST-Dienst unter Verwendung des Formulars auth
Ich versuche, mit den Wink RestClient Funktions-Test auf einem Rest-service-Endpunkt. Ich verwende mocks für unit-Tests, aber ich würde gerne funktional testen Sie als Endpunkt der Verbraucher.
Ich verstehen, einige werden Gegenstand für mich der Aufruf eines REST-Endpunktes, während die Verwendung von Formular-basierte auth aber das ist die aktuelle Architektur, die ich habe.
Die Mehrheit der Ressourcen, die ich testen möchte sind geschützte Ressourcen und die Anwendung (läuft auf Tomcat6) geschützt ist, durch die form der Authentifizierung. (wie in der unten web.xml snippet).
Was ich bisher ausprobiert habe ist eine erste Anruf an eine ungeschützte Ressource zu erhalten, die set-cookie-header, enthält JSESSIONID und verwenden Sie die JSESSIONID in den header ( über die Ressource.cookie () ), die in nachfolgenden Anfragen aber, die keine Frucht bringen.
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>
Meinen Wink RestClient-code sieht wie folgt aus. Alle Antworten sind 200, aber zwei Dinge, die ich bemerken, dass die Reaktion auf den Aufruf von /j_security_check/beinhaltet nicht das jsessionid-cookie, und der Anruf auf die geschützte Ressource an, sagte, ich hätte ein signin scheitern. Die Nutzlast für den Aufruf j_security_check wurde gefangen genommen, die direkt aus einer vorherigen erfolgreichen browser-Anfrage abgefangen.
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);
Irgendwelche Gedanken oder Erfahrungen mit dem Wink RestClient auszuüben form-auth-geschützten Ressourcen, wäre sehr dankbar. Ich glaube, ich würde unterhalten anderen frameworks, die ich gehört habe, der REST-Versicherte und andere, aber da die Anwendung nutzt Augenzwinkern und der RestClient scheint mir, was ich brauche, ich dachte, ich würde stick mit.
InformationsquelleAutor rogodeter | 2013-03-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gefunden, das problem und die Lösung
j_security_check war die Beantwortung meiner POST-Anforderung (authentifizieren), die mit einem #302/umleiten. Das war, gefolgt von den wink RestClient, aber meine JSESSIONID cookie wurde nicht angehängt. Verursacht wurde die Antwort (vom umgeleiteten URLs) enthalten, ein set-cookie-header, mit einem neuen header. Meine anschließenden Anrufe, in denen ich eingesetzt JSESSIONID vom ersten Anruf fehlgeschlagen, weil das cookie abgelaufen war. Alles was ich tun musste, war weisen Sie den RestClient NICHT zu Folgen, leitet. Wenn der redirect notwendig waren, würde ich bauen es auf meine eigene, mit den entsprechenden cookie.
Chrom und Firefox tragen Sie das cookie von der ursprünglichen Anforderung an die umgeleitete Anfrage so es ist alles gut.
Hier ist etwas code, der arbeitete für mich, mit JUnit4, RestClient von der Apache Wink-Projekt (und ein Jackson-ObjectMapper)
InformationsquelleAutor rogodeter