HttpClient 4.x (Tutorial) / HttpClient 4.x (Учебник): 1. Fundamentals (Основы)

← →
Английский оригинал Перевод на русский

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

1.1.4.1. Повторяемые объекты
Компонент может быть повторяемым, то есть его содержание может быть прочитано несколько раз. Это возможно только для автономным компонентов (как ByteArrayEntity или StringEntity)

gi1gi 25.11.10 в 14:29

0

1.1.4.2. Использование HTTP-объектов

gi1gi 25.11.10 в 14:30

0

Так как объекты могут представлять как бинарное, так и символьное содержание, они имеют поддержку кодировки символов (для поддержки последнего, т.е. символьного содержания).

gi1gi 25.11.10 в 14:36

0

Объект создается при выполнении запроса с включенным содержанием или когда запрос была успешной и тело ответа используется для отправки результата клиенту.

gi1gi 25.11.10 в 14:41

0

Чтобы прочитать содержимое объекта, можно либо получить входной поток с помощью метода HttpEntity.GetContent(), который возвращает java.io.InputStream, либо можно передать выходной поток в метод HttpEntity.writeTo(OutputStream), который вернет сразу все содержимое, которое было записано в данный поток.

gi1gi 25.11.10 в 14:42

0

Как только объект был получен из входящего сообщения, методы HttpEntity.getContentType() и HttpEntity.getContentLength() могут быть использованы для чтения общих метаданных, такие как Content-Type и Content-Length заголовков (если они доступны). Content-Type заголовок может включать информацию о кодировке текстовых MIME-типов, таких как text/plain или text/html; для чтения этой информации используется метод HttpEntity.getContentEncoding(). Если заголовки отсутствуют, то для длины возвращается -1, а для типа содержимого NULL. Если же Content-Type заголовок доступен, то будет возвращен экземпляр Header.

gi1gi 25.11.10 в 14:47

0

Когда объект создается для исходящего сообщения, эти мета данные должны быть установлены создателем объекта.

gi1gi 25.11.10 в 16:09

0

StringEntity myEntity = new StringEntity("important message", "UTF-8");

gi1gi 25.11.10 в 14:31

0

System.out.println(myEntity.getContentType()); System.out.println(myEntity.getContentLength()); System.out.println(EntityUtils.getContentCharSet(myEntity)); System.out.println(EntityUtils.toString(myEntity)); System.out.println(EntityUtils.toByteArray(myEntity).length);

gi1gi 25.11.10 в 14:31

0

stdout >

gi1gi 25.11.10 в 14:31

0

Content-Type: text/plain; charset=UTF-8 17 UTF-8 important message 17

gi1gi 25.11.10 в 14:31

0

1.1.5. Освобождение низкоуровневых ресурсов

gi1gi 25.11.10 в 16:13

0

Закончив работу с объектом ответа, важно обеспечить, чтобы содержимое объекта было извлечено полностью, после чего соединение может быть благополучно возвращено в пул соединений и затем повторно использовано диспетчером соединений для последующих запросов. Самый простой способ сделать это - вызвать метод HttpEntity.consumeContent() для извлечения из потока имеющегося содержания. При этом HttpClient автоматически возвращает лежащее в основе соединение обратно в Connection Manager, как только он обнаруживает, что был достигнут конец содержимого потока. Метод HttpEntity.consumeContent() является безопасным для вызова больше чем один раз.

gi1gi 25.11.10 в 16:26

0

Однако, может возникнуть ситуация, когда нужно извлечь лишь небольшую часть из всего содержимого ответа а потери производительности при извлечении оставшейся части содержания и освобождении соединения для многоразового использования слишком высоки; в таком случае можно просто прервать запрос, вызвав метод HttpUriRequest.abort().

gi1gi 25.11.10 в 16:58

0

HttpGet httpget = new HttpGet("http://localhost/");
HttpResponse response = httpclient.execute(httpget);
HttpEntity entity = response.getEntity();
if (entity != null)
{
InputStream instream = entity.getContent();
int byteOne = instream.read();
int byteTwo = instream.read();
// Do not need the rest
httpget.abort();
}

gi1gi 25.11.10 в 16:48

0

Соединение не будет использовано повторно, но ресурсы всех уровней, занятые им, будут правильно освобождены.

gi1gi 25.11.10 в 16:55

0

1.1.6. Извлечение содержания объектов

gi1gi 25.11.10 в 17:12

0

Рекомендуется извлекать содержимое объектов, используя их методы HttpEntity.GetContent() или HttpEntity.writeTo (OutputStream). HttpClient также поставляется с классом EntityUtils, который предоставляет несколько статических методов для более легкого чтения содержания или информации об объекте. Вместо непосредственного чтения java.io.InputStream, можно получить все тело содержание в виде строки/массива, используя методы этого класса. Однако, использование EntityUtils настоятельно не рекомендуется, если ответы, получены от надежных серверов HTTP и, как известно, ограниченной длины.???

gi1gi 25.11.10 в 17:14

0

HttpGet httpget = new HttpGet("http://localhost/");
HttpResponse response = httpclient.execute(httpget);
HttpEntity entity = response.getEntity();
if (entity != null)
{
long len = entity.getContentLength();
if (len != -1 && len < 2048)
{
System.out.println(EntityUtils.toString(entity));
}
else
{
// Stream content out
}
}

gi1gi 25.11.10 в 17:12

0

В некоторых ситуациях может потребоваться читать содержание объекта более одного раза. В этом случае содержание этого объекта должно быть буферизовано с помощью буфера в памяти или на диске. Простейший способ сделать это - обернуть оригинальный объект с помощью класса BufferedHttpEntity. Это приведет к тому, что оригинальное содержание объекта будет считываться в буфер в памяти. Во других случаях оболочка объекта будет иметь оригинал.

gi1gi 25.11.10 в 17:24

0

HttpGet httpget = new HttpGet("http://localhost/");
HttpResponse response = httpclient.execute(httpget);
HttpEntity entity = response.getEntity();
if (entity != null)
{
entity = new BufferedHttpEntity(entity);
}

gi1gi 25.11.10 в 17:21

0

1.1.7. Конструирование содержания объекта

gi1gi 01.12.10 в 20:29

0

HttpClient предоставляет несколько классов, которые могут быть использованы для эффективного извлечения потока содержания из HTTP-соединений. Экземпляры этих классов могут быть связаны с запросами, содержащими объекты, такими как POST и PUT, чтобы заключить содержимое объектов в исходящие HTTP-запросы. HttpClient предоставляет несколько классов для наиболее распространенных контейнеров данных, таких как строка, массив, входной поток, и файл: StringEntity, ByteArrayEntity, InputStreamEntity, и FileEntity.

gi1gi 01.12.10 в 20:37

0

File file = new File("somefile.txt");
FileEntity entity = new FileEntity(file, "text/plain; charset=\"UTF-8\"");

gi1gi 02.12.10 в 07:22

0

HttpPost httppost = new HttpPost("http://localhost/action.do"); httppost.setEntity(entity);

gi1gi 02.12.10 в 07:23

0

Пожалуйста, обратите внимание,что InputStreamEntity не является повторяемым, потому что он может быть прочитан из основного потока данных только один раз. Вообще рекомендуется для реализации пользовательского класса использовать HttpEntity, который является самодостаточным, а не общий InputStreamEntity. FileEntity может быть хорошей отправной точкой.
1.1.7.1. Объекты с динамическим содержанием

gi1gi 02.12.10 в 07:36

0

Часто HTTP-объекты должны быть сгенерированы динамически, на основе частично выполненного контекста. HttpClient обеспечивает поддержку динамических объектов с помощью класса EntityTemplate и интерфейса ContentProducer. Экземпляры ContentProducer являются объектами, которые генерируют свое содержание по требованию, записывая его в выходной поток. Они должны быть в состоянии генерировать содержание каждый раз, когда от них это требуется. Так объекты, созданные с помощью EntityTemplate, как правило, самодостаточны и являются повторяемыми.

gi1gi 02.12.10 в 07:37

0

ContentProducer cp = new ContentProducer()
{
public void writeTo(OutputStream outstream) throws IOException
{
Writer writer = new OutputStreamWriter(outstream, "UTF-8");
writer.write("<response>"); writer.write(" <content>");
writer.write(" important stuff"); writer.write(" </content>");
writer.write("</response>"); writer.flush();
}
};
HttpEntity entity = new EntityTemplate(cp); HttpPost httppost = new HttpPost("http://localhost/handler.do");
httppost.setEntity(entity);

gi1gi 02.12.10 в 07:37

0

1.1.7.2. HTML-формы

gi1gi 02.12.10 в 08:55

0

Многим приложениям часто необходимо имитировать процесс заполнения HTML-форм, например, для того, чтобы войти в веб-приложение или предоставить входные данные. HttpClient предоставляет специальный объектный класс UrlEncodedFormEntity для облегчения подобных действий.

gi1gi 02.12.10 в 09:04

0

List<namevaluepair> formparams = new ArrayList<namevaluepair>();
formparams.add(new BasicNameValuePair("param1", "value1"));
formparams.add(new BasicNameValuePair("param2", "value2"));
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formparams, "UTF-8");
HttpPost httppost = new HttpPost("http://localhost/handler.do");
httppost.setEntity(entity);</namevaluepair></namevaluepair>

gi1gi 02.12.10 в 09:05

0

Этот экземпляр UrlEncodedFormEntity будет использовать так называемое URL-кодирование для кодирования параметров и сгенерирует следующие данные:

gi1gi 02.12.10 в 09:10

0

param1=value1&param2=value2

gi1gi 02.12.10 в 09:10

0

1.1.7.3.

gi1gi 02.12.10 в 09:13

0

Вообще рекомендуется, чтобы HttpClient выбирал наиболее подходящую для передачи кодировку на основе свойств переданного HTTP-сообщения. Не исключено, однако, сообщить, что HttpClient кусок кодирования является предпочтительным путем установки HttpEntity.setChunked(), чтобы правда. Обратите внимание, что HttpClient будет использовать этот флаг только в качестве подсказки. Это значение также будет проигнорировано при использовании версий HTTP-протокола, которые не поддерживают блок кодирования, такие как HTTP/1.0.

gi1gi 02.12.10 в 09:37

0

StringEntity entity = new StringEntity("important message", "text/plain; charset=\"UTF-8\"");
entity.setChunked(true);
HttpPost httppost = new HttpPost("http://localhost/acrtion.do");
httppost.setEntity(entity);

gi1gi 02.12.10 в 11:09

0

1.1.8. Обработчики ответа

gi1gi 02.12.10 в 12:50

0

Самый простой и самый удобный способ для обработки ответов - с помощью интерфейса ResponseHandler. Этот метод полностью избавляет пользователя от необходимости беспокоиться об управлении соединением. При использовании ResponseHandler HttpClient автоматически позаботится обеспечения выпуска обратной связи на связи независимо от того, менеджер выполнения запроса успешно или причины исключения.

gi1gi 02.12.10 в 12:53

0

HttpClient httpclient = new DefaultHttpClient();
HttpGet httpget = new HttpGet("http://localhost/");

gi1gi 02.12.10 в 12:49

0

ResponseHandler handler = new ResponseHandler() { public byte[] handleResponse( HttpResponse response) throws ClientProtocolException, IOException
{
HttpEntity entity = response.getEntity();
if (entity != null)
{
return EntityUtils.toByteArray(entity);
}
else
{
return null;
}
}
};

gi1gi 02.12.10 в 12:49

0

byte[] response = httpclient.execute(httpget, handler);

gi1gi 02.12.10 в 12:48

0

1.2. HTTP-контекст выполнения

gi1gi 05.12.10 в 10:55

0

Первоначально HTTP был разработан без поддежрки состояний, как ответ-запрос ориентированный протокол. Однако, в реальных приложениях часто требуется иметь возможность сохранять информацию о состоянии после нескольких логически связанных обменов запрос-ответ. Для того, чтобы включить в приложение поддержку обработку HttpClient состояние позволяет HTTP запросы выполняются в течение определенного контекста выполнения, называется контексте HTTP. Несколько логически связанные запросы могут участвовать в логической сессии, если же контексте повторно между последовательными запросов. функции HTTP контексте аналогично java.util.Map . Это просто набор произвольных именованых значений. Приложение может заполнить атрибуты контекста до выполнения запроса или проанализировать контекст после исполнения запроса.

gi1gi 03.12.10 в 18:43

0
+1

В ходе выполнения HTTP-запроса HttpClient добавляет следующие атрибуты контекста исполнения:

gi1gi 03.12.10 в 20:29

0

'http.connection': экземпляр HttpConnection, представляющий фактическое соединение с целевым хостом.

gi1gi 03.12.10 в 20:31

0

'http.target_host': экземпляр HttpHost, представляющий целевой хост соединения.

gi1gi 05.12.10 в 08:11

0

'http.proxy_host': экземпляр HttpHost, представляющий прокси, если он используется.

gi1gi 05.12.10 в 08:14

0

'http.request': экземпляр HttpRequest, представляющий актуальный HTTP-запрос.

gi1gi 05.12.10 в 08:19

0

'http.response': экземпляр HttpResponse, представляющий актуальный HTTP-ответ.

gi1gi 05.12.10 в 08:20

0

'http.request_sent': экземпляр java.lang.Boolean, представляющий флаг, указывающий, был ли запрос передан целевому хосту полностью.

gi1gi 05.12.10 в 08:26

0
Минутку...

← Предыдущая страница

Следующая страница →