У меня есть довольно простой вспомогательный класс, который я использую для всего, что связано с Http Get / Post. Я использую HttpGet, HttpPost и HttpClient из библиотеки org.apache.http. Все мои вещи отлично работают по HTTP, но как только я попытался использовать службу, работающую по HTTPS, я получаю исключение ClientProtocolException при выполнении запроса. Единственное сообщение в исключении: «Серверу не удалось ответить правильным HTTP-ответом».
Для проверки я отправил ту же самую полезную нагрузку из браузера, используя простую HTML-форму, и Fiddler2, используя RequestBuilder. Я отправил недопустимые и пустые полезные данные и даже отправил все вышеперечисленное с заголовками и без них, чтобы выяснить, было ли что-то необычное в том, как объекты создавали запрос.
Все, что я использовал в тестировании, дает мне действительный HTTP-ответ 200 статуса. Служба просто дает мне структуру, описывающую ошибку, если я даю ей что-то, отличное от ожидаемого.
Есть ли что-то особенное, что мне нужно добавить к объектам (объектам) HttpPost или HttpClient, чтобы сказать ему использовать HTTPS? Должен ли я явно указать ему использовать другой порт?
EDIT:
Я действительно зарегистрировал неправильную фабрику сокетов для связи https. Вот обновленный метод, который я использую для создания моего объекта HttpClient с правильной фабрикой сокетов на случай, если кто-то будет искать такую проблему в будущем:
private HttpClient createHttpClient()
{
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, HTTP.DEFAULT_CONTENT_CHARSET);
HttpProtocolParams.setUseExpectContinue(params, true);
SchemeRegistry schReg = new SchemeRegistry();
schReg.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
schReg.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));
ClientConnectionManager conMgr = new ThreadSafeClientConnManager(params, schReg);
return new DefaultHttpClient(conMgr, params);
}