«1. Введение

Мы рассмотрим основы клиента OkHttp в нашем Руководстве по OkHttp.

В этом кратком руководстве мы рассмотрим различные типы POST-запросов для версии 3.x клиента.

2. Базовый POST

Мы можем использовать FormBody.Builder для создания базового RequestBody для отправки двух параметров — имени пользователя и пароля — с запросом POST:

@Test
public void whenSendPostRequest_thenCorrect() 
  throws IOException {
    RequestBody formBody = new FormBody.Builder()
      .add("username", "test")
      .add("password", "test")
      .build();

    Request request = new Request.Builder()
      .url(BASE_URL + "/users")
      .post(formBody)
      .build();

    Call call = client.newCall(request);
    Response response = call.execute();
    
    assertThat(response.code(), equalTo(200));
}

3. POST с авторизацией

Если мы хотим аутентифицировать запрос, мы можем использовать конструктор Credentials.basic для добавления учетных данных в заголовок.

В этом простом примере мы также отправим строку в качестве тела запроса:

@Test
public void whenSendPostRequestWithAuthorization_thenCorrect() 
  throws IOException {
    String postBody = "test post";
    
    Request request = new Request.Builder()
      .url(URL_SECURED_BY_BASIC_AUTHENTICATION)
      .addHeader("Authorization", Credentials.basic("username", "password"))
      .post(RequestBody.create(
        MediaType.parse("text/x-markdown), postBody))
      .build();

    Call call = client.newCall(request);
    Response response = call.execute();

    assertThat(response.code(), equalTo(200));
}

4. POST с JSON

Чтобы отправить JSON в теле запроса, мы должны установить его медиа-тип application/json. Мы можем сделать это с помощью компоновщика RequestBody.create:

@Test
public void whenPostJson_thenCorrect() throws IOException {
    String json = "{\"id\":1,\"name\":\"John\"}";

    RequestBody body = RequestBody.create(
      MediaType.parse("application/json"), json);

    Request request = new Request.Builder()
      .url(BASE_URL + "/users/detail")
      .post(body)
      .build();
 
    Call call = client.newCall(request);
    Response response = call.execute();

    assertThat(response.code(), equalTo(200));
}

5. Составной запрос POST

Последний пример, который мы рассмотрим, — составной запрос POST. Нам нужно построить наш RequestBody как MultipartBody, чтобы опубликовать файл, имя пользователя и пароль:

@Test
public void whenSendMultipartRequest_thenCorrect() 
  throws IOException {	
    RequestBody requestBody = new MultipartBody.Builder()
      .setType(MultipartBody.FORM)
      .addFormDataPart("username", "test")
      .addFormDataPart("password", "test")
      .addFormDataPart("file", "file.txt",
        RequestBody.create(MediaType.parse("application/octet-stream"), 
          new File("src/test/resources/test.txt")))
      .build();

    Request request = new Request.Builder()
      .url(BASE_URL + "/users/multipart")
      .post(requestBody)
      .build();

    Call call = client.newCall(request);
    Response response = call.execute();

    assertThat(response.code(), equalTo(200));
}

6. POST с кодировкой символов, отличной от используемой по умолчанию

Кодировка символов OkHttp по умолчанию — UTF-8: ~~ ~

@Test
public void whenPostJsonWithoutCharset_thenCharsetIsUtf8() throws IOException {
    final String json = "{\"id\":1,\"name\":\"John\"}";

    final RequestBody body = RequestBody.create(
        MediaType.parse("application/json"), json);

    String charset = body.contentType().charset().displayName();

    assertThat(charset, equalTo("UTF-8"));
}

Если мы хотим использовать другую кодировку символов, мы можем передать ее вторым параметром MediaType.parse():

@Test
public void whenPostJsonWithUtf16Charset_thenCharsetIsUtf16() throws IOException {
    final String json = "{\"id\":1,\"name\":\"John\"}";

    final RequestBody body = RequestBody.create(
        MediaType.parse("application/json; charset=utf-16"), json);

    String charset = body.contentType().charset().displayName();

    assertThat(charset, equalTo("UTF-16"));
}

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

В этой короткой статье мы увидели несколько примеры запросов POST с клиентом OkHttp.

Как обычно, примеры кода доступны на GitHub.