У меня проблема с подключением Apache HttpClient к сервису, внешнему по отношению к моей виртуализированной среде разработки.Чтобы получить доступ к Интернету (например, api.twitter.com), мне нужно позвонить по локальному URL (например, api.twitter.com.dev.mycompany.net), который затем перенаправит запрос на реальный хост.
Проблема в том, что на любой отправленный мной запрос я получаю ответ 404. Не найдено.
Я попытался отладить его с помощью wget, и проблема заключается в том, что сервер назначенияидентифицирует нужный ресурс, используя URL-адрес запроса и имя хоста в заголовке хоста.Поскольку имя хоста не совпадает, он не может найти ресурс.
Я (безуспешно) попытался переопределить заголовок хоста, установив параметр http.virtual-host на клиенте следующим образом:
HttpClient client = new DefaultHttpClient();
if (envType.isWithProxy()) {
client.getParams().setParameter(ClientPNames.VIRTUAL_HOST, "api.twitter.com");
}
Технические подробности:
Клиент используется в качестве исполнителя в RESTeasy для вызова REST API.Поэтому «ручная» настройка виртуального хоста (как описано здесь ) не является опцией.
Все делается через HTTPS / SSL - я не думаю, что это имеет значение.
Редактировать 1: Использование HttpHost вместо String также не дает желаемого эффекта:
HttpClient client = new DefaultHttpClient();
if (envType.isWithProxy()) {
HttpHost realHost = new HttpHost("api.twitter.com", port, scheme);
client.getParams().setParameter(ClientPNames.VIRTUAL_HOST, realHost);
}
Edit 2: Дальнейшее исследование показало, что параметр должен быть установлен в объекте запроса.Ниже приведен код v. 4.2-aplha1 HttpClient, устанавливающий виртуальный хост:
HttpRequest orig = request;
RequestWrapper origWrapper = wrapRequest(orig);
origWrapper.setParams(params);
HttpRoute origRoute = determineRoute(target, origWrapper, context);
virtualHost = (HttpHost) orig.getParams().getParameter(
ClientPNames.VIRTUAL_HOST);
params
- это параметры, передаваемые клиентом.Но значение «virtualHost» читается из параметров запроса.
Таким образом, это меняет природу вопроса на: Как установить свойство VIRTUAL_HOST для запросов?