Публикация с помощью HttpClient

Проводка с помощью HttpClient

1. обзор

В этом руководстве -we’ll POST with the HttpClient 4 - сначала используется авторизация, а затем свободный HttpClient API.

Наконец, мы обсудим, как загрузить файл с помощью Httpclient.

Дальнейшее чтение:

Расширенная настройка HttpClient

Конфигурации HttpClient для расширенных вариантов использования.

Read more

Как отправлять пользовательские файлы cookie с помощью Apache HttpClient 4.

Read more

HttpClient с SSL

Пример того, как настроить HttpClient с SSL.

Read more

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.