Автор оригинала: Eugen Paraschiv.
1. Обзор
В этом уроке – мы опубликуем с помощью HttpClient 4 – используя сначала авторизацию, а затем API fluent HttpClient.
Наконец, мы обсудим, как загрузить файл с помощью Httpclient.
Дальнейшее чтение:
Расширенная конфигурация HttpClient
HttpClient 4 – Отправить пользовательский файл cookie
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"); Listparams = 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); }
А вот наша расширенная версия HttpEntityWrapper ” Progress 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())); } }
И расширенная версия 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 to ” ProgressEntityWrapper ” – мы переопределяем метод writeTo() для использования нашего “CountingOutputStream”
9. Заключение
В этом уроке мы проиллюстрировали наиболее распространенные способы отправки HTTP-запросов POST с помощью Apache HttpClient 4 .
Мы узнали, как отправить запрос на публикацию с авторизацией, как опубликовать с помощью HttpClient fluent API и как загрузить файл и отслеживать его прогресс.
Реализацию всех этих примеров и фрагментов кода можно найти в проекте github .