Я переношу свое приложение на использование HttpClient5, но с каждым днем оно становится несчастным. Многие API-интерфейсы удалены, и нет надлежащей документации, позволяющей узнать альтернативы. Stackoverflow/любой другой веб-сайт/блоги всегда показывает ответы, связанные с httpcomponents4.x, но эти API больше не существуют в HttpClient5. Я размещаю здесь все свои запросы/альтернативы. Если кто-нибудь знает, пожалуйста, ответьте/подтвердите, если это правильные реализации.
Установка времени ожидания сокета на клиенте: удален
RequestConfig.custom().setSocketTimeout(socketTimeout).build()
API. После долгих исследований обнаружил, что существует отдельный класс SocketConfig, который необходимо установить наConnectionManager
SocketConfig socketConfig=SocketConfig.custom() .setSoTimeout(Timeout.ofMilliseconds(10000)) .build(); BasicHttpClientConnectionManager connMgr=new BasicHttpClientConnectionManager(registry); connMgr.setSocketConfig(socketConfig); CloseableHttpClient httpclient = HttpClients.custom() .setConnectionManager(connMgr) .build();
Установка хоста по умолчанию. Далее следует Как установить цель HttpHost по умолчанию в Apache HttpClient 4.3+? и обнаружили, что мы можем переопределить
determineRoute
вDefaultRoutePlanner
, но мы не можем сделать это в httpclient5, так как этот метод объявлен какfinal
, поэтому не может переопределить. Итак, я сделал это:HttpHost targetHost = new HttpHost(myHost,myPort); HttpRoutePlanner planner=new HttpRoutePlanner() { @Override public HttpRoute determineRoute(HttpHost var1, HttpContext var2) throws HttpException { HttpRoute route=new HttpRoute(targetHost);//default for all requests return route; } }; CloseableHttpClient client=HttpClients.custom() .setConnectionManager(mgr) .setRoutePlanner(planner) .build();
HttpRequestBase
заменено наHttpUriRequestBase
— в HttpRequestBase мы вызывали getRequestLine(), чтобы узнать подробности запроса, который печатается, как показано ниже:
POST https://url HTTPS/1.1
Но getRequestLine()
API удален в HttpUriRequestBase, поэтому я использую так:
httpReq.getMethod()+" "+httpReq.getUri()
но протокол не печатается, даже если я использую httpReq.getVersion()
- Нет отдельных библиотек
httpasyncclient
httpcore-nio
дляHttpClient5
. После исследования выяснилось, что все объединено вhttpclient5
иhttpcore5
. Теперь здесь начинаются дополнительные трудности. Все классы ниже больше не существуют.
SSLIOSessionStrategy
NoopIOSessionStrategy
PoolingNHttpClientConnectionManager
DefaultConnectingIOReactor
ConnectingIOReactor
IOReactorException
Пока не знаю альтернатив для этого. IOReactorConfig
API не ясны. В демонстрационных примерах IOReactorConfig
было установлено на CloseableHttpAsyncClient
без примеров SSLcontext. В моем случае, согласно существующему коду, они используют IOReactorConfig
и SSLContext
. Теперь не уверен, как клуб этих.
Подскажите, правильно ли я делаю или нет.
Там много других. Будет обновляться.