Проблема в том, что WebResource неизменен - метод cookie () возвращает WebResource.Builder. Таким образом, выполнение следующих действий просто создает новый экземпляр WebResource.Builder каждый раз, когда вы вызываете cookie (и вообще не изменяет исходный WebResource). Вы игнорируете эти экземпляры Builder и по-прежнему выполняете запрос на исходном WebResource:
for ( NewCookie c : CookieJar.Cookies ) {
logger.debug( "Setting cookie " + c.getName() );
wr.cookie( c );
}
Вместо этого вы должны сделать следующее:
WebResource.Builder builder = wr.getRequestBuilder();
for (NewCookie c : CookieJar.Cookies) {
builder = builder.cookie(c);
}
Затем вы можете сделать запрос:
ClientResponse response = builder.queryParams(qs).get(ClientResponse.class);
Кроме того, чтобы избежать дублирования этого кода во всех ваших ресурсных методах, вы можете рассмотреть возможность написания клиентского фильтра, который сделает это за вас для всех ваших запросов. Например. следующий код гарантирует, что куки, отправленные с сервера, будут установлены для каждого ответа:
client.addFilter(new ClientFilter() {
private ArrayList<Object> cookies;
@Override
public ClientResponse handle(ClientRequest request) throws ClientHandlerException {
if (cookies != null) {
request.getHeaders().put("Cookie", cookies);
}
ClientResponse response = getNext().handle(request);
if (response.getCookies() != null) {
if (cookies == null) {
cookies = new ArrayList<Object>();
}
// simple addAll just for illustration (should probably check for duplicates and expired cookies)
cookies.addAll(response.getCookies());
}
return response;
}
});
ПРИМЕЧАНИЕ. Это будет работать только в том случае, если вы не делитесь экземплярами клиента с несколькими потоками!