Публикуване с HttpClient

1. Общ преглед

В този урок - ще публикуваме с HttpClient 4 - като използваме първо упълномощаване, а след това плавния API на HttpClient.

Накрая ще обсъдим как да качите файл с помощта на Httpclient.

2. Основен POST

Първо, нека да разгледаме един прост пример и да изпратим POST заявка, използвайки HttpClient .

Ще направим POST с два параметъра - „ потребителско име “ и „ парола “:

@Test public void whenSendPostRequestUsingHttpClient_thenCorrect() throws ClientProtocolException, IOException { CloseableHttpClient client = HttpClients.createDefault(); HttpPost httpPost = new HttpPost("//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. POST с разрешение

След това нека видим как да направите POST с идентификационни данни за удостоверяване с помощта на HttpClient .

В следния пример - изпращаме POST заявка към URL, защитен с Basic Authentication чрез добавяне на заглавие Authorization:

@Test public void whenSendPostRequestWithAuthorizationUsingHttpClient_thenCorrect() throws ClientProtocolException, IOException, AuthenticationException { CloseableHttpClient client = HttpClients.createDefault(); HttpPost httpPost = new HttpPost("//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. POST с JSON

Сега - нека видим как да изпратим POST заявка с JSON тяло с помощта на HttpClient .

В следния пример - изпращаме информация за човек ( идентификатор, име ) като JSON:

@Test public void whenPostJsonUsingHttpClient_thenCorrect() throws ClientProtocolException, IOException { CloseableHttpClient client = HttpClients.createDefault(); HttpPost httpPost = new HttpPost("//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(); }

Обърнете внимание как използваме StringEntity, за да зададем тялото на заявката.

Също така задаваме заглавката ContentType на application / json, за да предоставим на сървъра необходимата информация за представянето на съдържанието, което изпращаме.

5. POST с HttpClient Fluent API

След това нека да POST с HttpClient Fluent API.

Ще изпратим заявка с два параметъра „ потребителско име “ и „ парола “:

@Test public void whenPostFormUsingHttpClientFluentAPI_thenCorrect() throws ClientProtocolException, IOException { HttpResponse response = Request.Post("//www.example.com").bodyForm( Form.form().add("username", "John").add("password", "pass").build()) .execute().returnResponse(); assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); }

6. POST заявка за много части

Сега нека публикуваме заявка за няколко части.

Ще публикуваме файл , потребителско име и парола, използвайки MultipartEntityBuilder :

@Test public void whenSendMultipartRequestUsingHttpClient_thenCorrect() throws ClientProtocolException, IOException { CloseableHttpClient client = HttpClients.createDefault(); HttpPost httpPost = new HttpPost("//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.txt “, използвайки MultipartEntityBuilder :

@Test public void whenUploadFileUsingHttpClient_thenCorrect() throws ClientProtocolException, IOException { CloseableHttpClient client = HttpClients.createDefault(); HttpPost httpPost = new HttpPost("//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. Вземете напредък при качване на файлове

И накрая - нека видим как да постигнем напредъка при качване на файлове с помощта на HttpClient .

В следващия пример ще разширим HttpEntityWrapper, за да получим видимост в процеса на качване.

Първо - ето методът за качване:

@Test public void whenGetUploadFileProgressUsingHttpClient_thenCorrect() throws ClientProtocolException, IOException { CloseableHttpClient client = HttpClients.createDefault(); HttpPost httpPost = new HttpPost("//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); }

И ето нашата разширена версия на HttpEntityWrapperProgressEntityWrapper “:

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

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

В този урок илюстрирахме най-често срещаните начини за изпращане на POST HTTP заявки с Apache HttpClient 4 .

Научихме как да изпращаме POST заявка с упълномощаване, как да публикуваме с помощта на плавен API на HttpClient и как да качваме файл и да следим напредъка му.

Изпълнението на всички тези примери и кодови фрагменти може да се намери в проекта github.