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

Многоступенчатая загрузка с помощью HttpClient 4

Как загрузить объект с помощью многоступенчатой загрузки с помощью HttpClient.

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

1. Обзор

В этом уроке мы проиллюстрируем, как выполнить операцию многоступенчатой загрузки с использованием HttpClient 4 .

Мы будем использовать http://echo.200please.com в качестве тестового сервера, потому что он общедоступен и принимает большинство типов контента.

Если вы хотите копнуть глубже и узнать другие интересные вещи, которые вы можете сделать с помощью HttpClient – перейдите к основному учебнику HttpClient .

2. Использование метода AddPart

Давайте начнем с рассмотрения объекта MultipartEntityBuilder для добавления частей в сущность Http , которая затем будет загружена с помощью операции POST.

Это общий метод добавления частей в HttpEntity , представляющий форму.

Пример 2.1. – Загрузка формы с двумя текстовыми частями и файлом

File file = new File(textFileName);
HttpPost post = new HttpPost("http://echo.200please.com");
FileBody fileBody = new FileBody(file, ContentType.DEFAULT_BINARY);
StringBody stringBody1 = new StringBody("Message 1", ContentType.MULTIPART_FORM_DATA);
StringBody stringBody2 = new StringBody("Message 2", ContentType.MULTIPART_FORM_DATA);
// 
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
builder.addPart("upfile", fileBody);
builder.addPart("text1", stringBody1);
builder.addPart("text2", stringBody2);
HttpEntity entity = builder.build();
//
post.setEntity(entity);
HttpResponse response = client.execute(post);

Обратите внимание, что мы создаем экземпляр объекта File , также указывая значение ContentType , которое будет использоваться сервером.

Кроме того, обратите внимание, что метод AddPart имеет два аргумента, действующих как пары ключ/значение для формы. Они актуальны только в том случае, если серверная сторона действительно ожидает и использует имена параметров-в противном случае они просто игнорируются.

3. Использование методов addBinaryBody и addTextBody

Более прямым способом создания составного объекта является использование методов addBinaryBody и AddTextBody . Эти методы работают для загрузки текста, файлов, массивов символов и InputStream объектов. Давайте проиллюстрируем это на простых примерах.

Пример 3.1. – Загрузка текста и части текстового файла

HttpPost post = new HttpPost("http://echo.200please.com");
File file = new File(textFileName);
String message = "This is a multipart post";
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
builder.addBinaryBody("upfile", file, ContentType.DEFAULT_BINARY, textFileName);
builder.addTextBody("text", message, ContentType.DEFAULT_BINARY);
// 
HttpEntity entity = builder.build();
post.setEntity(entity);
HttpResponse response = client.execute(post);

Обратите внимание, что объекты Тело файла и StringBody здесь не нужны.

Также важно, что большинство серверов не проверяют ContentType тела текста, поэтому метод addTextBody может опустить значение ContentType .

API addBinaryBody принимает ContentType – но также можно создать сущность только из двоичного тела и имени параметра формы, содержащего файл. Как указывалось в предыдущем разделе, некоторые серверы не распознают файл, если не указано значение ContentType .

Затем мы добавим zip-файл в качестве InputStream, в то время как файл изображения будет добавлен в качестве Файла объекта:

Пример 3.2. – Загрузка Zip-файла, файла изображения и текстовой части

HttpPost post = new HttpPost("http://echo.200please.com");
InputStream inputStream = new FileInputStream(zipFileName);
File file = new File(imageFileName);
String message = "This is a multipart post";
MultipartEntityBuilder builder = MultipartEntityBuilder.create();         
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
builder.addBinaryBody
  ("upfile", file, ContentType.DEFAULT_BINARY, imageFileName);
builder.addBinaryBody
  ("upstream", inputStream, ContentType.create("application/zip"), zipFileName);
builder.addTextBody("text", message, ContentType.TEXT_PLAIN);
// 
HttpEntity entity = builder.build();
post.setEntity(entity);
HttpResponse response = client.execute(post);

Обратите внимание, что значение Content Type может быть создано на лету, как в приведенном выше примере для zip-файла.

Наконец, не все серверы признают InputStream детали. Сервер, экземпляр которого мы создали в первой строке кода, распознает InputStream s.

Давайте теперь рассмотрим другой пример, где addBinaryBody работает непосредственно с массивом байтов:

Пример 3.3. – Загрузка массива байтов и текста

HttpPost post = new HttpPost("http://echo.200please.com");
String message = "This is a multipart post";
byte[] bytes = "binary code".getBytes(); 
// 
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
builder.addBinaryBody("upfile", bytes, ContentType.DEFAULT_BINARY, textFileName);
builder.addTextBody("text", message, ContentType.TEXT_PLAIN);
// 
HttpEntity entity = builder.build();
post.setEntity(entity);
HttpResponse response = client.execute(post);

Обратите внимание на ContentType – который теперь указывает двоичные данные.

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

В этой статье MultipartEntityBuilder представлен как гибкий объект, который предлагает несколько вариантов API для создания составной формы.

В примерах также показано, как использовать HttpClient для загрузки HttpEntity , аналогичного сущности формы.

Реализацию всех этих примеров и фрагментов кода можно найти в нашем проекте GitHub – это проект на основе Eclipse, поэтому его должно быть легко импортировать и запускать как есть.