Async http client java

Асинхронный HTTP с асинхронным http-клиентом в Java

AsyncHttpClient (AHC) — это библиотека, построенная на основеNetty, с целью простого выполнения HTTP-запросов и асинхронной обработки ответов.

В этой статье мы расскажем, как настроить и использовать HTTP-клиент, как выполнить запрос и обработать ответ с помощью AHC.

2. Настроить

Последнюю версию библиотеки можно найти в папкеMaven repository. Мы должны быть осторожны, чтобы использовать зависимость с идентификатором группыorg.asynchttpclient, а не с зависимостью сcom.ning:

 org.asynchttpclient async-http-client 2.2.0 

3. Конфигурация клиента HTTP

Самый простой способ получить HTTP-клиент — использовать классDsl. Статический методasyncHttpClient() возвращает объектAsyncHttpClient:

AsyncHttpClient client = Dsl.asyncHttpClient();

Если нам нужна специальная конфигурация HTTP-клиента, мы можем построить объектAsyncHttpClient с помощью построителяDefaultAsyncHttpClientConfig.Builder:

DefaultAsyncHttpClientConfig.Builder clientBuilder = Dsl.config()

Это дает возможность настроить тайм-ауты, прокси-сервер, HTTP-сертификаты и многое другое:

DefaultAsyncHttpClientConfig.Builder clientBuilder = Dsl.config() .setConnectTimeout(500) .setProxyServer(new ProxyServer(. )); AsyncHttpClient client = Dsl.asyncHttpClient(clientBuilder);

После того, как мы настроили и получилиan instance of the HTTP client we can reuse it across out application. Нам не нужно создавать экземпляр для каждого запроса, потому что внутри он создает новые потоки и пулы соединений, что приведет к проблемам с производительностью.

Также важно отметить, чтоonce we’ve finished using the client we should call to close() method to prevent any memory leaks или зависшие ресурсы.

Читайте также:  Html код поп ап

4. Создание HTTP-запроса

Есть два метода, в которых мы можем определить HTTP-запрос, используя AHC:

Нет большой разницы между двумя типами запросов с точки зрения производительности. Они представляют только два отдельных API, которые мы можем использовать для определения запроса. A bound request is tied to the HTTP client it was created from and will, by default, use the configuration of that specific client if not specified otherwise.с

Например, при создании связанного запроса флагdisableUrlEncoding считывается из конфигурации HTTP-клиента, а для несвязанного запроса по умолчанию установлено значение false. Это полезно, потому что конфигурацию клиента можно изменить без перекомпиляции всего приложения, используя системные свойства, передаваемые в качестве аргументов виртуальной машины:

java -jar -Dorg.asynchttpclient.disableUrlEncodingForBoundRequests=true

Полный список свойств можно найти в файлеahc-default.properties.

4.1. Связанный запрос

Для создания связанного запроса мы используем вспомогательные методы из классаAsyncHttpClient, которые начинаются с префикса“prepare”. Также мы можем использовать методprepareRequest(), который получает уже созданный объектRequest.

Например, методprepareGet() создаст HTTP-запрос GET:

BoundRequestBuilder getRequest = client.prepareGet("http://www.example.com");

4.2. Несвязанный запрос

Несвязанный запрос можно создать с помощью классаRequestBuilder:

Request getRequest = new RequestBuilder(HttpConstants.Methods.GET) .setUrl("http://www.example.com") .build();

или с помощью вспомогательного классаDsl, который фактически используетRequestBuilder для настройки метода HTTP и URL-адреса запроса:

Request getRequest = Dsl.get("http://www.example.com").build()

5. Выполнение HTTP-запросов

Название библиотеки дает нам подсказку о том, как запросы могут быть выполнены. AHC поддерживает как синхронные, так и асинхронные запросы.

Выполнение запроса зависит от его типа. При использовании классаbound request we use the execute() method from the BoundRequestBuilder и когда у нас естьunbound request we’ll execute it using one of the implementations of the executeRequest() method from the AsyncHttpClient interface.

5.1. Синхронно

Библиотека была спроектирована как асинхронная, но при необходимости мы можем имитировать синхронные вызовы, заблокировав объектFuture. Оба методаexecute() иexecuteRequest() возвращают объектListenableFuture . Этот класс расширяет интерфейс JavaFuture, наследуя методget(), который можно использовать для блокировки текущего потока до тех пор, пока HTTP-запрос не будет завершен и не вернет ответ:

Future responseFuture = boundGetRequest.execute(); responseFuture.get();
Future responseFuture = client.executeRequest(unboundRequest); responseFuture.get();

Использование синхронных вызовов полезно при попытке отладки частей нашего кода, но не рекомендуется использовать в производственной среде, где асинхронное выполнение приводит к повышению производительности и пропускной способности.

5.2. Асинхронный

Когда мы говорим об асинхронных выполнениях, мы также говорим о слушателях для обработки результатов. Библиотека AHC предоставляет 3 типа слушателей, которые можно использовать для асинхронных HTTP-вызовов:

СлушательAsyncHandler предлагает возможность контролировать и обрабатывать HTTP-вызов до его завершения. С его помощью можно обработать серию событий, связанных с вызовом HTTP:

request.execute(new AsyncHandler() < @Override public State onStatusReceived(HttpResponseStatus responseStatus) throws Exception < return null; >@Override public State onHeadersReceived(HttpHeaders headers) throws Exception < return null; >@Override public State onBodyPartReceived(HttpResponseBodyPart bodyPart) throws Exception < return null; >@Override public void onThrowable(Throwable t) < >@Override public Object onCompleted() throws Exception < return null; >>);

ПеречислениеState позволяет нам контролировать обработку HTTP-запроса. ВозвращаяState.ABORT we can stop the processing в определенный момент и используяState.CONTINUE, мы даем завершение обработки.

Важно отметить, чтоAsyncHandler isn’t thread-safe and shouldn’t be reused when executing concurrent requests.

AsyncCompletionHandler наследует все методы интерфейсаAsyncHandler и добавляет вспомогательный методonCompleted(Response) для обработки завершения вызова. Все другие методы прослушивателя переопределяются для возвратаState.CONTINUE, что делает код более читаемым:

request.execute(new AsyncCompletionHandler() < @Override public Object onCompleted(Response response) throws Exception < return response; >>);

ИнтерфейсListenableFuture позволяет нам добавлять слушателей, которые будут запускаться после завершения HTTP-вызова.

Кроме того, давайте выполним код от слушателей — используя другой пул потоков:

ListenableFuture listenableFuture = client .executeRequest(unboundRequest); listenableFuture.addListener(() -> < Response response = listenableFuture.get(); LOG.debug(response.getStatusCode()); >, Executors.newCachedThreadPool());

Помимо возможности добавления слушателей, интерфейсListenableFuture позволяет нам преобразовать ответFuture вCompletableFuture.

7. Заключение

AHC — очень мощная библиотека с множеством интересных функций. Он предлагает очень простой способ настройки HTTP-клиента и возможность выполнения как синхронных, так и асинхронных запросов.

Как всегда доступен исходный код статьиover on GitHub.

Источник

Saved searches

Use saved searches to filter your results more quickly

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.

An asynchronous HTTP client built on top of Java’s HttpURLConnection

License

urgrue/java-async-http

This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Sign In Required

Please sign in to use Codespaces.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching Xcode

If nothing happens, download Xcode and try again.

Launching Visual Studio Code

Your codespace will open once ready.

There was a problem preparing your codespace, please try again.

Latest commit

Git stats

Files

Failed to load latest commit information.

README.md

A simple, lightweight, asynchronous HTTP client built on top of Java’s HttpURLConnection .

Please feel free to report any issues.

Simply create either an AsyncHttpClient (asynchronous) or SyncHttpClient (synchronous) instance and make requests with the get() , post() , put() , delete() , or head() methods. Responses are handled by callbacks through HttpResponseHandler usually created as an anonymous inner class of the function call.

String url = "https://api.twitch.tv/kraken/games/top"; // Set the GET parameters RequestParams params = new RequestParams(); params.put("limit", 1); params.put("offset", 0); HttpClient client = new AsyncHttpClient(); client.setHeader("Accept", "application/vnd.twitchtv.v3+json"); // Optional: send custom headers; sent with all future requests client.setUserAgent("my-java-application"); // Optional: set a custom user-agent client.get(url, params, new StringHttpResponseHandler() < @Override public void onSuccess(int statusCode, MapString, ListString>> headers, String content) < /* Request was successful */ > @Override public void onFailure(int statusCode, MapString, ListString>> headers, String content) < /* Server responded with a status code 4xx or 5xx error */ > @Override public void onFailure(Throwable throwable) < /* An exception occurred during the request. Usually unable to connect or there was an error reading the response */ > >);

The above example reads String responses using StringHttpResponseHandler . It will automatically determine the response encoding and encode the String for you.

For raw data, use HttpResponseHandler as it returns an array of bytes,

client.get(url, params, new HttpResponseHandler() < @Override public void onSuccess(int statusCode, MapString, ListString>> headers, byte[] content) <> @Override public void onFailure(int statusCode, MapString, ListString>> headers, byte[] content) <> >);

Download files using FileHttpResponseHandler :

String url = "https://example.org/cool-file.zip"; File file = new File("C:\\cool-file.zip"); // Save path HttpClient client = new AsyncHttpClient(); client.get(url, new FileHttpResponseHandler(file) < @Override public void onSuccess(int statusCode, MapString, ListString>> headers, File content) <> @Override public void onFailure(int statusCode, MapString, ListString>> headers, File content) <> @Override public void onProgressChanged(long bytesReceived, long totalBytes) < /* Optional: Track download progress. Will be called several times during file download */ System.out.println("Downloaded: " + bytesReceived + " / " + totalBytes); > >);

The RequestParams object is used to specify HTTP request parameters such as for GET and POST. GET parameters are automatically appended to the URL and POST parameters will be sent in the content body.

Upload files by placing File objects in the RequestParams object.

File uploadFile = new File("party.png"); params.put("photo", uploadFile);

HTTP Basic Authentication

Set HTTP Basic Authentication credentials by calling setBasicAuth() . These credentials will be sent with all future requests.

client.setBasicAuth("username", "password");

Источник

Оцените статью