Apache HttpClient упрощает взаимодействие с RESTful API, поддерживая различные HTTP-методы, заголовки и конфигурации запросов. В этой статье будет рассмотрено, как использовать REST API с помощью Apache HttpClient5 с примерами.
1. Настройка
Прежде чем приступить к реализации, нам необходимо импортировать последнюю версию Apache HttpClient.
<dependency><groupId>org.apache.httpcomponents.client5</groupId><artifactId>httpclient5</artifactId><version>5.4.1</version></dependency>
Далее нам нужно создать базовый экземпляр HttpClient. Мы используем CloseableHttpClient, который является основным классом в библиотеке HttpClient для выполнения HTTP-запросов. Этот класс реализует интерфейс Closeable и обеспечивает правильное закрытие соединений после использования.
CloseableHttpClient также поддерживает настройку тайм-аутов, пула соединений и аутентификации.
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;import org.apache.hc.client5.http.impl.classic.HttpClients;import org.apache.hc.client5.http.config.RequestConfig;public class CustomHttpClientConfig {public static CloseableHttpClient createCustomHttpClient() {RequestConfig config = RequestConfig.custom().setConnectTimeout(5000).setResponseTimeout(5000).build();return HttpClients.custom().setDefaultRequestConfig(config).build();}}
2. REST API
API HTTP GET и POST REST, к которым я буду получать доступ, определены.
@POST@Path("/users")public User addUser(User user) {// Implementation to add a user}@GET@Path("/users")public List<User> all() {// Implementation to retrieve all users}@GET@Path("/users/{id}")public User getById(@PathParam("id") Integer id) {// Implementation to retrieve a user by ID}
3. Пример API POST
Программа Java для создания нового пользователя в системе путем использования API POST /users rest.
import org.apache.hc.client5.http.classic.methods.HttpPost;import org.apache.hc.core5.http.io.entity.StringEntity;import org.apache.hc.core5.http.ContentType;import org.apache.hc.core5.http.HttpStatus;import com.fasterxml.jackson.databind.ObjectMapper;// Inside some methodCloseableHttpClient httpClient = HttpClientConfig.createHttpClient();HttpPost postRequest = new HttpPost("http://localhost:8080/users");User newUser = new User("John", "Doe", "john.doe@example.com");ObjectMapper mapper = new ObjectMapper();String json = mapper.writeValueAsString(newUser);StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON);postRequest.setEntity(entity);try(CloseableHttpResponse response = httpClient.execute(postRequest)) {int statusCode = response.getCode();if(statusCode == HttpStatus.SC_CREATED) {String responseBody = EntityUtils.toString(response.getEntity());User createdUser = mapper.readValue(responseBody, User.class);System.out.println("User created: " + createdUser);} else {System.err.println("Failed to create user. HTTP Status: " + statusCode);}} catch(Exception e) {e.printStackTrace();}
4. Пример API GET
В следующем примере извлекаются все пользователи из списка путем вызова API GET /users.
import org.apache.hc.client5.http.classic.methods.HttpGet;import org.apache.hc.core5.http.io.entity.EntityUtils;import org.apache.hc.core5.http.HttpStatus;import java.util.List;import com.fasterxml.jackson.core.type.TypeReference;import com.fasterxml.jackson.databind.ObjectMapper;CloseableHttpClient httpClient = HttpClientConfig.createHttpClient();HttpGet getRequest = new HttpGet("http://localhost:8080/users");try(CloseableHttpResponse response = httpClient.execute(getRequest)) {int statusCode = response.getCode();if(statusCode == HttpStatus.SC_OK) {String responseBody = EntityUtils.toString(response.getEntity());ObjectMapper mapper = new ObjectMapper();List<User> users = mapper.readValue(responseBody, new TypeReference<List<User>>() {});users.forEach(System.out::println);} else {System.err.println("Failed to fetch users. HTTP Status: " + statusCode);}} catch(Exception e) {e.printStackTrace();}
Аналогичным образом мы можем получить данные пользователя, вызвав API GET /users/{id}.
import org.apache.hc.client5.http.classic.methods.HttpGet;import org.apache.hc.core5.http.io.entity.EntityUtils;import org.apache.hc.core5.http.HttpStatus;import com.fasterxml.jackson.databind.ObjectMapper;CloseableHttpClient httpClient = HttpClientConfig.createHttpClient();int userId = 1;HttpGet getRequest = new HttpGet("http://localhost:8080/users/" + userId);try(CloseableHttpResponse response = httpClient.execute(getRequest)) {int statusCode = response.getCode();if(statusCode == HttpStatus.SC_OK) {String responseBody = EntityUtils.toString(response.getEntity());ObjectMapper mapper = new ObjectMapper();User user = mapper.readValue(responseBody, User.class);System.out.println("User retrieved: " + user);} else {System.err.println("Failed to fetch user. HTTP Status: " + statusCode);}} catch(Exception e) {e.printStackTrace();}
5. Отправка заголовков и данных аутентификации
Вот как отправлять пользовательские заголовки и базовую аутентификацию:
import org.apache.hc.client5.http.classic.methods.HttpGet;import org.apache.hc.core5.http.io.entity.EntityUtils;import org.apache.hc.client5.http.impl.auth.BasicCredentialsProvider;import org.apache.hc.core5.http.HttpStatus;import org.apache.hc.client5.http.auth.UsernamePasswordCredentials;import org.apache.hc.client5.http.auth.AuthScope;import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;import org.apache.hc.client5.http.impl.classic.HttpClients;//Add auth details in the httpclient instanceBasicCredentialsProvider credsProvider = new BasicCredentialsProvider();credsProvider.setCredentials(new AuthScope("localhost", 8080),new UsernamePasswordCredentials("admin", "password".toCharArray()));CloseableHttpClient httpClient = HttpClients.custom().setDefaultCredentialsProvider(credsProvider).build();HttpGet getRequest = new HttpGet("http://localhost:8080/protected-resource");//Adding headersgetRequest.addHeader("Custom-Header", "CustomValue");try(CloseableHttpResponse response = httpClient.execute(getRequest)) {int statusCode = response.getCode();if(statusCode == HttpStatus.SC_OK) {String responseBody = EntityUtils.toString(response.getEntity());System.out.println("Response: " + responseBody);} else {System.err.println("Failed to access resource. HTTP Status: " + statusCode);}} catch(Exception e) {e.printStackTrace();}
6. Отправка и получение файлов cookie
Класс BasicCookieStore может использоваться для автоматического управления файлами cookie во время HTTP-коммуникации. Он реализует интерфейс CookieStore и обеспечивает потокобезопасный способ хранения, извлечения и управления файлами cookie.
- Для входящих запросов HttpClient обнаруживает файлы cookie и сохраняет их в BasicCookieStore.
- Для исходящих запросов HttpClient проверяет файлы cookie в BasicCookieStore, чтобы увидеть, соответствуют ли они целевому домену, пути и другим свойствам. Если совпадение найдено, эти файлы cookie добавляются в запрос(заголовок Cookie).
- Мы также можем вручную проверять, добавлять или удалять файлы cookie в BasicCookieStore.
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;import org.apache.hc.client5.http.impl.classic.HttpClients;import org.apache.hc.client5.http.impl.cookie.BasicCookieStore;import org.apache.hc.client5.http.classic.methods.HttpGet;import org.apache.hc.core5.http.cookie.Cookie;import org.apache.hc.core5.http.io.entity.EntityUtils;BasicCookieStore cookieStore = new BasicCookieStore();// Create an HttpClient with the cookie storeCloseableHttpClient httpClient = HttpClients.custom().setDefaultCookieStore(cookieStore).build();// Send a GET requestHttpGet getRequest = new HttpGet("http://localhost:8080/users");try(var response = httpClient.execute(getRequest)) {String responseBody = EntityUtils.toString(response.getEntity());System.out.println("Response: " + responseBody);// Retrieve cookies stored in the CookieStoreList<Cookie> cookies = cookieStore.getCookies();for(Cookie cookie : cookies) {System.out.println("Cookie: " + cookie.getName() + " = " + cookie.getValue());}} catch(Exception e) {e.printStackTrace();}
Напишите мне свои комментарии по поводу примера httpclient для http-запроса POST и запроса GET.