HttpClientで投稿する

HttpClientを使用した投稿

1. 概要

このチュートリアルでは–we’ll POST with the HttpClient 4 –最初の認証を使用し、次に流暢なHttpClientAPIを使用します。

最後に、Httpclientを使用してファイルをアップロードする方法について説明します。

参考文献:

高度なHttpClient設定

高度なユースケース向けのHttpClient構成。

Apache HttpClient 4でカスタムCookieを送信する方法。

SSLを使用したHttpClient

SSLを使用してHttpClientを構成する方法の例。

2. 基本的なPOST

まず、簡単な例を見て、HttpClientを使用してPOSTリクエストを送信しましょう。

username」と「password」の2つのパラメータを使用してPOSTを実行します。

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

POSTリクエストにパラメータを含めるためにNameValuePairListをどのように使用したかに注意してください。

3. 承認付きのPOST

次に、HttpClientを使用して認証資格情報を使用してPOSTを実行する方法を見てみましょう。

次の例では、Authorizationヘッダーを追加して、基本認証で保護されたURLにPOSTリクエストを送信します。

@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

では、HttpClientを使用してJSON本文を含むPOSTリクエストを送信する方法を見てみましょう。

次の例では、いくつかのperson情報(id, name)を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();
}

StringEntityを使用してリクエストの本文を設定する方法に注意してください。

We’re also setting the ContentType header to application/jsonは、送信するコンテンツの表現に関する必要な情報をサーバーに提供します。

5. HttpClient Fluent APIを使用したPOST

次に、HttpClient FluentAPIを使用してPOSTします。

2つのパラメータ「username」と「password」を使用してリクエストを送信します。

@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マルチパートリクエスト

それでは、マルチパートリクエストをPOSTしましょう。

MultipartEntityBuilderを使用して、File、ユーザー名、およびパスワードを投稿します。

@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を使用してFileをアップロードする

次に、HttpClient.を使用してFileをアップロードする方法を見てみましょう

MultipartEntityBuilderを使用して「test.txt」ファイルをアップロードします。

@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アップロードを取得 進捗

最後に、HttpClientを使用してFileアップロードの進行状況を取得する方法を見てみましょう。

次の例では、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);
}

そして、これが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. 結論

このチュートリアルでは、Apache HttpClient 4を使用してPOSTHTTPリクエストを送信する最も一般的な方法を説明しました。

承認を使用してPOSTリクエストを送信する方法、HttpClientの流暢なAPIを使用して投稿する方法、ファイルをアップロードしてその進行状況を追跡する方法を学びました。

これらすべての例とコードスニペットの実装は、the github projectにあります。