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

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

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

Глава 1. Основы

gi1gi 25.11.10 в 13:27

0

1.1. Выполнение запроса

gi1gi 25.11.10 в 13:28

0

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

gi1gi 01.12.10 в 15:34

0

Вполне естественно, что основной точкой входа в HttpClient API является интерфейс HttpClient, который определяет акт, описанный выше.

gi1gi 01.12.10 в 15:38

0

Вот пример процесса выполнения запроса в своей простейшей форме:

gi1gi 01.12.10 в 15:40

0

HttpClient httpclient = new DefaultHttpClient();
HttpGet httpget = new HttpGet("http://localhost/");
HttpResponse response = httpclient.execute(httpget);
HttpEntity entity = response.getEntity();
if (entity != null)
{
InputStream instream = entity.getContent();
int l;
byte[] tmp = new byte[2048];
while ((l = instream.read(tmp)) != -1)
{
}
}

gi1gi 25.11.10 в 13:28

0

1.1.1. HTTP-запрос

gi1gi 25.11.10 в 13:28

0

Все HTTP запросы имеют строку запроса, состоящую из имени метода, запрашиваемого URI и версии HTTP протокола.

gi1gi 25.11.10 в 13:30

0

HttpClient поддерживает все HTTP-методы, определенные в спецификации HTTP/1.1: GET, HEAD, POST, PUT, DELETE, TRACE и OPTIONS. Существует специальный класс для каждого типа метода: HttpGet, HttpHead, HttpPost, HttpPut, HttpDelete, HttpTrace, и HttpOptions.

gi1gi 01.12.10 в 15:46

0

Request-URI - это Универсальным Идентификатором Ресурса, который идентифицирует ресурс, к которому обращен запрос. URI HTTP-запроса состоит из схемы протокола, имени хоста, дополнительно порта, пути к ресурсу, дополнительно запроса, и дополнительный фрагмента.

gi1gi 25.11.10 в 13:31

0

HttpGet httpget = new HttpGet( "http://www.google.com/search?hl=en&q=httpclient&btnG=Google+Search&aq=f&oq=");

gi1gi 25.11.10 в 13:33

0

HttpClient предоставляет ряд полезных методов для упрощения создания и модификации запрашиваемых URI.

gi1gi 25.11.10 в 13:33

0

URI может быть составлен програмно:

gi1gi 25.11.10 в 13:33

0

URI uri = URIUtils.createURI("http", "www.google.com", -1, "/search", "q=httpclient&btnG=Google+Search&aq=f&oq=", null);
HttpGet httpget = new HttpGet(uri);
System.out.println(httpget.getURI());

gi1gi 25.11.10 в 13:34

0

stdout >

gi1gi 25.11.10 в 13:34

0

http://www.google.com/search?q=httpclient&btnG=Google+Search&aq=f&oq=

gi1gi 25.11.10 в 13:34

0

Строка запроса также может быть создана из индивидуальных параметров:

gi1gi 25.11.10 в 13:34

0

List<namevaluepair> qparams = new ArrayList<namevaluepair>();
qparams.add(new BasicNameValuePair("q", "httpclient"));
qparams.add(new BasicNameValuePair("btnG", "Google Search")); qparams.add(new BasicNameValuePair("aq", "f"));
qparams.add(new BasicNameValuePair("oq", null));
URI uri = URIUtils.createURI("http", "www.google.com", -1, "/search", URLEncodedUtils.format(qparams, "UTF-8"), null);
HttpGet httpget = new HttpGet(uri);
System.out.println(httpget.getURI());</namevaluepair></namevaluepair>

gi1gi 25.11.10 в 13:38

0

stdout >

gi1gi 25.11.10 в 13:37

0

http://www.google.com/search?q=httpclient&btnG=Google+Search&aq=f&oq=

gi1gi 25.11.10 в 13:38

0

1.1.2. HTTP-ответ

gi1gi 25.11.10 в 13:35

0

HTTP ответ - это сообщение, отправленное сервером клиенту после получения и интерпретации сообщения запроса. Первая строка этого сообщения состоит из версии протокола, за которой следует цифровой код статуса и связанная с ним текстовая фраза.

gi1gi 25.11.10 в 13:38

0

HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, HttpStatus.SC_OK, "OK");

gi1gi 25.11.10 в 13:38

0

System.out.println(response.getProtocolVersion());
System.out.println(response.getStatusLine().getStatusCode());
System.out.println(response.getStatusLine().getReasonPhrase());
System.out.println(response.getStatusLine().toString())

gi1gi 25.11.10 в 13:38

0

stdout >

gi1gi 25.11.10 в 13:37

0

HTTP/1.1
200
OK
HTTP/1.1 200 OK

gi1gi 25.11.10 в 13:39

0

1.1.3. Заголовки HTTP-сообщения

gi1gi 25.11.10 в 13:40

0

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

gi1gi 25.11.10 в 13:41

0

HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, HttpStatus.SC_OK, "OK");
response.addHeader("Set-Cookie", "c1=a; path=/; domain=localhost");
response.addHeader("Set-Cookie", "c2=b; path=\"/\", c3=c; domain=\"localhost\"");
Header h1 = response.getFirstHeader("Set-Cookie");
System.out.println(h1); Header h2 = response.getLastHeader("Set-Cookie"); System.out.println(h2);
Header[] hs = response.getHeaders("Set-Cookie");
System.out.println(hs.length);

gi1gi 25.11.10 в 13:42

0

stdout >

gi1gi 25.11.10 в 13:37

0

Set-Cookie: c1=a; path=/; domain=localhost Set-Cookie: c2=b; path="/", c3=c; domain="localhost" 2

gi1gi 25.11.10 в 13:42

0

Наиболее эффективным способ получить все заголовки конкретного типа - использование интерфейса HeaderIterator.

gi1gi 25.11.10 в 13:44

0

HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, HttpStatus.SC_OK, "OK");
response.addHeader("Set-Cookie", "c1=a; path=/; domain=localhost");
response.addHeader("Set-Cookie", "c2=b; path=\"/\", c3=c; domain=\"localhost\"");

gi1gi 25.11.10 в 13:45

0

HeaderIterator it = response.headerIterator("Set-Cookie");

gi1gi 25.11.10 в 13:45

0

while (it.hasNext())
{
System.out.println(it.next());
}

gi1gi 25.11.10 в 13:45

0

stdout >

gi1gi 25.11.10 в 13:37

0

Set-Cookie: c1=a; path=/; domain=localhost Set-Cookie: c2=b; path="/", c3=c; domain="localhost"

gi1gi 25.11.10 в 13:47

0

Он также предоставляет удобные методы для разбора HTTP-сообщений на отдельных элементы заголовка.

gi1gi 25.11.10 в 13:46

0

HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, HttpStatus.SC_OK, "OK"); response.addHeader("Set-Cookie", "c1=a; path=/; domain=localhost"); response.addHeader("Set-Cookie", "c2=b; path=\"/\", c3=c; domain=\"localhost\"");

gi1gi 25.11.10 в 13:47

0

HeaderElementIterator it = new BasicHeaderElementIterator( response.headerIterator("Set-Cookie"));

gi1gi 25.11.10 в 13:48

0

while (it.hasNext())
{
HeaderElement elem = it.nextElement();
System.out.println(elem.getName() + " = " + elem.getValue());
NameValuePair[] params = elem.getParameters();
for (int i = 0; i &lt; params.length; i++)
{
System.out.println(" " + params[i]);
}
}

gi1gi 25.11.10 в 13:48

0

stdout >

gi1gi 25.11.10 в 13:37

0

c1 = a path=/ domain=localhost c2 = b path=/ c3 = c domain=localhost

gi1gi 25.11.10 в 13:49

0

1.1.4. HTTP-объект

gi1gi 25.11.10 в 13:52

0

HTTP сообщения могут передавать объекты содержания, ассоциированные с запросом или ответом. Объекты содержатся не во всех запросах и ответах, так как являются не обязательными. Запросы, использующие объекты, называются запросами, включающими объекты (entity enclosing requests). Спецификация HTTP определяет два методы для работы с включенными объектами: POST и PUT. Ответы, как правило, включают объект содержания. Однако, из этого правила есть исключения, напримет ответы на HEAD-метод и 204 No Content, 304 Not Modified, 205 Reset Content responses.

gi1gi 25.11.10 в 13:52

0

HttpClient выделяет три вида объектов, в зависимости от того, откуда получено содержание:

gi1gi 25.11.10 в 14:07

0

Потоковые объекты: Содержание, полученно из потока, либо сгенерировано на лету. В частности, к этой категории относятся объекты, полученные из HTTP-ответов. Поточные объекты, как правило, не являются повторяемыми.

gi1gi 25.11.10 в 14:08

0

Автономные объекты: Содержание, находится в памяти или полученно независимо от соединения или других объектов. Автономные объекты, как правило, являются повторяемыми. Этот тип объектов в основном используется для объектов, входящих в HTTP-запросы.

gi1gi 25.11.10 в 14:11

0

Объекты – оболочки: Содержание, полученно из других объектов.

gi1gi 25.11.10 в 14:11

0

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

gi1gi 25.11.10 в 14:23

0
Минутку...

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