Я подключаюсь к RESTful API, который имеет ресурс входа в систему: / login.Используя учетные данные, которые они дали мне, это приводит к хорошему 200
.Но попытка получить доступ к защищенным ресурсам впоследствии дает мне 401
(хотя работает с аддоном Firefox RESTClient).После отладки я обнаружил, что некоторые файлы cookie отклоняются, и я полагаю, что они не позволяют мне войти.
Предупреждающее сообщение на них:
Файл cookie отклонен [somename = "somevalue ", версия: 0, домен: xyz.org: 443 , путь: /, expiry: null] Недопустимый атрибут 'domain'" xyz: 443 ".Домен происхождения: "xyz"
Я использую Apache HTTP Client httpcomponents-client-4.5.6
для подключения к сайту.Что я могу сделать?Насколько я вижу, единственное, что беспокоит, это: 443.API доступен только через https.Я не узнал, смогу ли я изменить свой доступ к сайту с помощью httpclient, поэтому он больше не видит различий в доменных именах.
Я много искал и нашел много устаревших решений, касающихся CookieSpecProviders иустановив CookieSpecs в «easy» - но все это, казалось, полностью исключило все куки.Мой отладочный вывод из хранилища cookie всегда был пустым после использования этих решений (но предупреждающие сообщения исчезли).
Я создал быстрый и грязный изолированный пример:
package apitest;
import java.io.IOException;
import org.apache.http.HttpHost;
import org.apache.http.client.CookieStore;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.cookie.Cookie;
import org.apache.http.impl.client.BasicCookieStore;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
public class ApiTest {
public static void main(String[] args) {
HttpHost target = new HttpHost("stackoverflow.com", 443, "https");
HttpClientContext context = HttpClientContext.create();
CookieStore cookieStore = new BasicCookieStore();
HttpClientBuilder clientBuilder = HttpClientBuilder.create().setDefaultCookieStore(cookieStore);
CloseableHttpClient httpClient = clientBuilder.build();
HttpGet stackGet = new HttpGet("");
CloseableHttpResponse response;
try {
response = httpClient.execute(target, stackGet, context);
printCookies(cookieStore);
} catch (IOException e) {
e.printStackTrace();
}
stackGet = new HttpGet("/tags");
try {
response = httpClient.execute(target, stackGet, context);
printCookies(cookieStore);
} catch (IOException e) {
e.printStackTrace();
}
}
static void printCookies(CookieStore cookieStore) {
for (Cookie c : cookieStore.getCookies()) {
System.out.println(c.getName() + " : " + c.getValue());
}
}
}
Тамвыполняются два последовательных запроса GET, которые приводят к правильному поведению.Файл cookie 'prov', который должен быть своего рода файлом cookie сеанса, остается неизменным.То же самое, что было сделано с вышеупомянутым API, дает ошибку.