#java #rest #cookies
#java #rest #файлы cookie
Вопрос:
Я должен реализовать загрузку документа в систему архивирования через REST-интерфейс, используя Java с spring boot.
Мне сказали сначала сделать запрос GET с базовой аутентификацией. Это даст мне файлы cookie авторизации в ответе. Затем я должен отправить эти файлы cookie с POST-запросом, чтобы выполнить фактическое архивирование.
ПОЛУЧЕНИЕ работает нормально. Я прочитал в Интернете, что я должен получить файлы cookie в заголовке «Set-Cookie» ответа. Но я не получаю файлы cookie.
Странно то, что если я выполняю запрос с помощью Postman, я получаю 2 файла cookie («AuthSessionId» и «ClientID»). Почему я не могу получить их программно?
В качестве примечания: Postman также показывает, что я получил 15 (другое?) заголовки в ответе. У меня нет проблем с поиском их в моем ClientHttpResponse
Вот некоторый код:
ClientHttpResponse response = request.execute();
// this is org.springframework.http.client.ClientHttpResponse
List<String> cookies = response.getHeaders().get(HttpHeaders.SET_COOKIE);
if (cookies != null) {
for (String cook : cookies) {
System.out.println("cookie: " cook);
}
} else {
System.out.println("no cookie in " HttpHeaders.SET_COOKIE); // this is what I get
}
Комментарии:
1. Как вы создаете фабрику запросов? Например, если вы используете реализацию Apache HttpClient, она перехватывает заголовки файлов cookie и удаляет их, сохраняя вместо этого в хранилище файлов cookie, которые http-интерфейсы Spring не предоставляют. В этом случае вам было бы лучше использовать сами классы Apache HttpClient и прочитать о том, как получить доступ к файлам cookie для этого.
Ответ №1:
кумесана прав. Файлы cookie отфильтровываются и помещаются в CookieStore. Если я установил это раньше, я могу получить их после завершения запроса:
CookieStore cookieStore = new BasicCookieStore();
CloseableHttpClient client = HttpClientBuilder
.create()
.setDefaultCredentialsProvider(credentialsProvider)
.setConnectionManager(poolingConnectionManager)
.setDefaultCookieStore(cookieStore)
.build();