Проводка с помощью HttpClient
1. обзор
В этом руководстве -we’ll POST with the HttpClient 4 - сначала используется авторизация, а затем свободный HttpClient API.
Наконец, мы обсудим, как загрузить файл с помощью Httpclient.
Дальнейшее чтение:
Расширенная настройка HttpClient
Конфигурации HttpClient для расширенных вариантов использования.
HttpClient 4 - Отправить Custom Cookie
Как отправлять пользовательские файлы cookie с помощью Apache HttpClient 4.
2. Базовый пост
Во-первых, давайте рассмотрим простой пример и отправим запрос POST с использованиемHttpClient.
Мы выполним POST с двумя параметрами - «username» и «password»:
@Test
public void whenSendPostRequestUsingHttpClient_thenCorrect()
throws ClientProtocolException, IOException {
CloseableHttpClient client = HttpClients.createDefault();
HttpPost httpPost = new HttpPost("http://www.example.com");
List params = new ArrayList();
params.add(new BasicNameValuePair("username", "John"));
params.add(new BasicNameValuePair("password", "pass"));
httpPost.setEntity(new UrlEncodedFormEntity(params));
CloseableHttpResponse response = client.execute(httpPost);
assertThat(response.getStatusLine().getStatusCode(), equalTo(200));
client.close();
}
Обратите внимание, как мы использовалиList изNameValuePair для включения параметров в запрос POST.
3. POST с авторизацией
Затем давайте посмотрим, как выполнить POST с учетными данными для аутентификации, используяHttpClient.
В следующем примере - мы отправляем запрос POST на URL-адрес, защищенный с помощью базовой аутентификации, добавляя заголовок авторизации:
@Test
public void whenSendPostRequestWithAuthorizationUsingHttpClient_thenCorrect()
throws ClientProtocolException, IOException, AuthenticationException {
CloseableHttpClient client = HttpClients.createDefault();
HttpPost httpPost = new HttpPost("http://www.example.com");
httpPost.setEntity(new StringEntity("test post"));
UsernamePasswordCredentials creds
= new UsernamePasswordCredentials("John", "pass");
httpPost.addHeader(new BasicScheme().authenticate(creds, httpPost, null));
CloseableHttpResponse response = client.execute(httpPost);
assertThat(response.getStatusLine().getStatusCode(), equalTo(200));
client.close();
}
4. POST с JSON
Теперь давайте посмотрим, как отправить запрос POST с телом JSON, используяHttpClient.
В следующем примере мы отправляем некоторую информациюperson (id, name) в виде JSON:
@Test
public void whenPostJsonUsingHttpClient_thenCorrect()
throws ClientProtocolException, IOException {
CloseableHttpClient client = HttpClients.createDefault();
HttpPost httpPost = new HttpPost("http://www.example.com");
String json = "{"id":1,"name":"John"}";
StringEntity entity = new StringEntity(json);
httpPost.setEntity(entity);
httpPost.setHeader("Accept", "application/json");
httpPost.setHeader("Content-type", "application/json");
CloseableHttpResponse response = client.execute(httpPost);
assertThat(response.getStatusLine().getStatusCode(), equalTo(200));
client.close();
}
Обратите внимание, как мы используемStringEntity для задания тела запроса.
We’re also setting the ContentType header to application/json, чтобы предоставить серверу необходимую информацию о представлении контента, который мы отправляем.
5. POST сHttpClient Fluent API
Затем давайте проведем POST с API-интерфейсомHttpClient Fluent.
Мы собираемся отправить запрос с двумя параметрами «username» и «password»:
@Test
public void whenPostFormUsingHttpClientFluentAPI_thenCorrect()
throws ClientProtocolException, IOException {
HttpResponse response = Request.Post("http://www.example.com").bodyForm(
Form.form().add("username", "John").add("password", "pass").build())
.execute().returnResponse();
assertThat(response.getStatusLine().getStatusCode(), equalTo(200));
}
6. Многостраничный запрос POST
Теперь давайте проведем POST многостраничный запрос.
Мы опубликуемFile, имя пользователя и пароль, используяMultipartEntityBuilder:
@Test
public void whenSendMultipartRequestUsingHttpClient_thenCorrect()
throws ClientProtocolException, IOException {
CloseableHttpClient client = HttpClients.createDefault();
HttpPost httpPost = new HttpPost("http://www.example.com");
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.addTextBody("username", "John");
builder.addTextBody("password", "pass");
builder.addBinaryBody(
"file", new File("test.txt"), ContentType.APPLICATION_OCTET_STREAM, "file.ext");
HttpEntity multipart = builder.build();
httpPost.setEntity(multipart);
CloseableHttpResponse response = client.execute(httpPost);
assertThat(response.getStatusLine().getStatusCode(), equalTo(200));
client.close();
}
7. ЗагрузитеFile, используяHttpClient
Затем давайте посмотрим, как загрузитьFile с помощьюHttpClient.
Загрузим файл «test.txt», используяMultipartEntityBuilder:
@Test
public void whenUploadFileUsingHttpClient_thenCorrect()
throws ClientProtocolException, IOException {
CloseableHttpClient client = HttpClients.createDefault();
HttpPost httpPost = new HttpPost("http://www.example.com");
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.addBinaryBody(
"file", new File("test.txt"), ContentType.APPLICATION_OCTET_STREAM, "file.ext");
HttpEntity multipart = builder.build();
httpPost.setEntity(multipart);
CloseableHttpResponse response = client.execute(httpPost);
assertThat(response.getStatusLine().getStatusCode(), equalTo(200));
client.close();
}
8. ПолучитьFile Загрузить Прогресс
Наконец, давайте посмотрим, как узнать прогресс загрузкиFile с помощьюHttpClient.
В следующем примере мы расширимHttpEntityWrapper, чтобы наглядно показать процесс загрузки.
Во-первых, вот метод загрузки:
@Test
public void whenGetUploadFileProgressUsingHttpClient_thenCorrect()
throws ClientProtocolException, IOException {
CloseableHttpClient client = HttpClients.createDefault();
HttpPost httpPost = new HttpPost("http://www.example.com");
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.addBinaryBody(
"file", new File("test.txt"), ContentType.APPLICATION_OCTET_STREAM, "file.ext");
HttpEntity multipart = builder.build();
ProgressEntityWrapper.ProgressListener pListener =
percentage -> assertFalse(Float.compare(percentage, 100) > 0);
httpPost.setEntity(new ProgressEntityWrapper(multipart, pListener));
CloseableHttpResponse response = client.execute(httpPost);
assertThat(response.getStatusLine().getStatusCode(), equalTo(200));
client.close();
}
Мы также добавим интерфейсProgressListener, который позволит нам наблюдать за процессом загрузки:
public static interface ProgressListener {
void progress(float percentage);
}
А вот наша расширенная версияHttpEntityWrapper «ProgressEntityWrapper»:
public class ProgressEntityWrapper extends HttpEntityWrapper {
private ProgressListener listener;
public ProgressEntityWrapper(HttpEntity entity, ProgressListener listener) {
super(entity);
this.listener = listener;
}
@Override
public void writeTo(OutputStream outstream) throws IOException {
super.writeTo(new CountingOutputStream(outstream, listener, getContentLength()));
}
}
И расширенная версияFilterOutputStream «CountingOutputStream«:
public static class CountingOutputStream extends FilterOutputStream {
private ProgressListener listener;
private long transferred;
private long totalBytes;
public CountingOutputStream(
OutputStream out, ProgressListener listener, long totalBytes) {
super(out);
this.listener = listener;
transferred = 0;
this.totalBytes = totalBytes;
}
@Override
public void write(byte[] b, int off, int len) throws IOException {
out.write(b, off, len);
transferred += len;
listener.progress(getCurrentProgress());
}
@Override
public void write(int b) throws IOException {
out.write(b);
transferred++;
listener.progress(getCurrentProgress());
}
private float getCurrentProgress() {
return ((float) transferred / totalBytes) * 100;
}
}
Обратите внимание, что:
-
При расширенииFilterOutputStream до «CountingOutputStream” – мы переопределяем методwrite() для подсчета записанных (переданных) байтов.
-
При расширенииHttpEntityWrapper до «ProgressEntityWrapper” – мы переопределяем методwriteTo(), чтобы использовать наш“CountingOutputStream”
9. Заключение
В этом руководстве мы проиллюстрировали наиболее распространенные способы отправки HTTP-запросов POST сApache HttpClient 4.
Мы узнали, как отправить POST-запрос с авторизацией, как отправлять сообщения с помощью APIHttpClient fluent и как загружать файл и отслеживать его прогресс.
Реализацию всех этих примеров и фрагментов кода можно найти вthe github project.