Перейти к основному содержимому

Краткое руководство по отправке запросов с помощью OkHttp

· 3 мин. чтения

1. Введение

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

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

2. Базовый ПОСТ

Мы можем использовать 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. ОТПРАВКА с 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 .