Рубрики
Без рубрики

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

Как ОТПРАВЛЯТЬ сообщения с помощью HttpClient 4 – от базового запроса до аутентификации, составных запросов, загрузки файлов и отслеживания хода длительных операций.

Автор оригинала: Eugen Paraschiv.

1. Обзор

В этом уроке – мы опубликуем с помощью HttpClient 4 – используя сначала авторизацию, а затем API fluent HttpClient.

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

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

Расширенная конфигурация HttpClient

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

HttpClient 4 – Отправить пользовательский файл cookie

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

HttpClient с SSL

Пример настройки HttpClient с SSL.
Подробнее

2. Основной ПОСТ

Во-первых, давайте рассмотрим простой пример и отправим запрос POST с помощью HttpClient .

Мы сделаем ПОСТ с двумя параметрами – ” имя пользователя ” и ” пароль “:

@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();
}

Обратите внимание, как мы использовали Список от NameValuePair чтобы включить параметры в запрос POST.

3. СООБЩЕНИЕ С Авторизацией

Далее давайте посмотрим, как сделать ЗАПИСЬ с учетными данными аутентификации с помощью 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. СООБЩЕНИЕ С JSON

Теперь давайте посмотрим, как отправить запрос POST с телом JSON, используя HttpClient .

В следующем примере – мы отправляем некоторую person информацию ( id, имя ) в виде 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();
}

Обратите внимание, как мы используем Строгость чтобы задать тело запроса.

Мы также устанавливаем заголовок ContentType в application/json , чтобы предоставить серверу необходимую информацию о представлении содержимого, которое мы отправляем.

5. ПУБЛИКАЦИЯ С помощью API HttpClient Fluent

Далее, давайте опубликуем с помощью HttpClient Fluent API.

Мы отправим запрос с двумя параметрами ” имя пользователя ” и ” пароль “:

@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 Multipart Запрос

Теперь давайте ОТПРАВИМ запрос на несколько частей.

Мы опубликуем Файл , имя пользователя и пароль с использованием Многокомпонентный конструктор :

@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. Загрузите файл С помощью HttpClient

Далее давайте посмотрим, как загрузить Файл с помощью HttpClient.

Мы загрузим ” Мы загрузим ” “файл с использованием Многокомпонентный конструктор :

@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 upload с помощью 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);
}

А вот наша расширенная версия HttpEntityWrapperProgress EntityWrapper “:

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()));
    }
}

И расширенная версия FilterOutputStreamCountingOutputStream “:

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 to ” ProgressEntityWrapper ” – мы переопределяем метод writeTo() для использования нашего “CountingOutputStream”

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

В этом уроке мы проиллюстрировали наиболее распространенные способы отправки HTTP-запросов POST с помощью Apache HttpClient 4 .

Мы узнали, как отправить запрос на публикацию с авторизацией, как опубликовать с помощью HttpClient fluent API и как загрузить файл и отслеживать его прогресс.

Реализацию всех этих примеров и фрагментов кода можно найти в проекте github .