Я подключаюсь к RESTful API, у которого есть ресурс для входа: /login. Используя учетные данные, которые они мне дали, это приводит к хорошему 200
. Но попытка получить доступ к защищенным ресурсам после этого дает мне 401
(однако он действительно работает с надстройкой RESTClient для Firefox). После отладки я обнаружил, что некоторые файлы cookie отклоняются, и я полагаю, что они не пускают меня.
Предупреждающее сообщение на них:
Файл cookie отклонен [somename="somevalue", версия:0, домен:xyz.org:443, путь:/, срок действия:null] Недопустимый атрибут "домен" "xyz:443". Домен происхождения: "xyz"
Я использую HTTP-клиент Apache httpcomponents-client-4.5.6
для подключения к сайту. Могу ли я что-нибудь сделать? Насколько я вижу, единственное, что его беспокоит, это: 443. API доступен только через https. Я не выяснил, могу ли я изменить свой доступ к сайту с помощью httpclient, поэтому он больше не видит разницы в доменных именах.
Я много искал и пришел ко многим устаревшим решениям, касающимся CookieSpecProviders и настройке CookieSpecs на «легкий», но все это, казалось, полностью устранило все файлы cookie. Мой отладочный вывод хранилища файлов 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, дает ошибку.