Примечание. Следующий код основан на httpclient4.5.2.
Проще реализовать запрос GET -запроса, используя httpclient от Java:
public Static String get (String url) {stockableHttpresponsestonse = null; BufferedReader in = null; String result = ""; try {stockablehttpclienthttppclient = httpclients.createdefault (); Httpgethttpget = new httpget (url); response = httppclient.execute (httpget); in = new BufferedReader (new InputStreamReader (response.getEntity (). getContent ())); StringBuffersb = new StringBuffer (""); String line = ""; String nl = System.getProperty ("line.separator"); while ((line = in.readline ())! = null) {sb.append (line + nl); } in.close (); result = sb.toString (); } catch (ioException e) {e.printstackTrace (); } наконец {try {if (null! = response) response.close (); } catch (ioException e) {e.printstackTrace (); }} return result; }Приведенный выше метод также полезен при многопоточном выполнении запросов GET. Тем не менее, этот многопоточный запрос основан на создании экземпляра HTTPClient каждый раз, когда вызывается метод GET. Каждый экземпляр HTTPClient переработана один раз. Это, очевидно, не оптимальная реализация.
HttpClient предоставляет многопоточное решение для запроса, и вы можете просмотреть официальный документ «Менеджер по объединению подключения». Многоподобные запросы HTTPClient реализованы на основе встроенного пула соединений, который имеет класс ключа, а именно PoolingHttpClientConnectionManager, который отвечает за управление пулом соединений HTTPClient. Существует два ключевых метода, доступные в PoolingHttpClientConnectionManager: SetMaxTotal и SetDefaultMaxPerroute. SETMAXTOTAL Устанавливает максимальное количество подключений в пул соединений, а SetDefaultMaxPerroute устанавливает количество подключений по умолчанию по каждому маршруту. Существует также метод setmaxperroute - установите максимальное количество соединений для определенного сайта отдельно, например, это:
Httphostost = new httphost ("locahost", 80); cm.setmaxperroute (новый httproute (хост), 50);Наша реализация запроса GET немного скорректирована в соответствии с документацией:
пакет com.zhyea.robin; Импорт org.apache.http.client.methods.closablehttpresponse; import org.apache.http.client.methods.httpget; import org.apache.http.impl.client.closablehttpclient; импорт org.apache.http.impl.client.httpclient; import org.apache.http.impl.client.httpclient; import org.apache.http.impl.client.httpclient; org.apache.http.impl.conn.poolinghttpclientConnectionManager; Импорт java.io.bufferedReader; импорт java.io.ioexception; импорт java.io.inputStreamReader; открытый класс httputil {private static closablehttpclienthttpclient; static {poolinghttpclientConnectionmanagercm = new PoolinghttpclientConnectionManager (); cm.setmaxtotal (200); cm.setdefaultmaxperroute (20); cm.setdefaultmaxperroute (50); httpclient = httpclients.custom (). setConnectionManager (cm) .build (); } public static String get (string url) {stockableHttpresponsponse = null; BufferedReaderin = null; String result = ""; try {httpgethttpget = new httpget (url); response = httpclient.execute (httpget); in = new BufferedReader (new InputStreamReader (response.getEntity (). getContent ())); StringBuffersb = new StringBuffer (""); String line = ""; String nl = System.getProperty ("line.separator"); while ((line = in.readline ())! = null) {sb.append (line + nl); } in.close (); result = sb.toString (); } catch (ioException e) {e.printstackTrace (); } наконец {try {if (null! = response) response.close (); } catch (ioException e) {e.printstackTrace (); }} return result; } public static void main (string [] args) {System.out.println (get ("https://www.baidu.com/")); }}Это все. Но для меня я предпочитаю реализацию Fluent Http Pclient. Например, запрос HTTP GET, который мы только что реализовали, может быть реализован просто так:
пакет com.zhyea.robin; Import org.apache.http.client.fluent.request; импорт java.io.ioexception; открытый класс httputil {public static String get (string url) {string result = ""; try {result = request.get (url) .connecttimeout (1000) .sockettimeout (1000) .execute (). returncontent (). } catch (ioException e) {e.printstackTrace (); } return Result; } public static void main (string [] args) {System.out.println (get ("https://www.baidu.com/")); }}Все, что нам нужно сделать, это заменить предыдущую зависимость httpclient на зависимость от Fluent-HC:
<Depective> <groupid> org.apache.httpcomponents </GroupId> <artifactid> fluent-hc </artifactid> <sersive> 4.5.2 </version> </depertion>
И эта свободная реализация естественным образом достигается с использованием PoolingHttpClientConnectionManager. Значения Maxtotal и Defaultmaxperroute, которые он устанавливает, составляют 200 и 100 соответственно:
Connmgr = новый PoolingHttpClientConnectionManager (SFR); Connmgr.setdefaultmaxperroute (100); Connmgr.setmaxtotal (200);
Единственное, что заставляет людей расстраиваться, это то, что исполнитель не дает способа отрегулировать эти два значения. Но этого достаточно. Если это действительно не работает, вы также можете рассмотреть возможность переписывания метода исполнителя, а затем напрямую использовать исполнителя для выполнения запроса GET:
Executor.newinstance (). Execute (request.get (url)) .returncontent (). Apstring ();
вот и все!