Una guía rápida para publicar solicitudes con OkHttp

1. Introducción

Cubrimos los conceptos básicos del cliente OkHttp en nuestra Guía de OkHttp.

En este breve tutorial, veremos específicamente los diferentes tipos de solicitudes POST para la versión 3.x del cliente.

2. POST Básico

Podemos usar FormBody.Builder para construir un RequestBody básico para enviar dos parámetros, nombre de usuario y contraseña , con una solicitud 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. PUBLICAR con autorización

Si queremos autenticar la solicitud, podemos usar el constructor Credentials.basic para agregar credenciales al encabezado.

En este ejemplo simple, también enviaremos una cadena como el cuerpo de la solicitud:

@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. PUBLICAR con JSON

Para enviar JSON en el cuerpo de la solicitud, tenemos que configurar su tipo de medio application / json . Podemos hacerlo usando el constructor 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. Solicitud POST de varias partes

El último ejemplo que veremos es una solicitud POST de varias partes. Necesitamos construir nuestro RequestBody como MultipartBody para publicar un archivo, un nombre de usuario y una contraseña:

@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 con codificación de caracteres no predeterminada

La codificación de caracteres predeterminada de OkHttp es 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")); }

Si queremos usar una codificación de caracteres diferente, podemos pasarla como segundo parámetro del 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. Conclusión

En este breve artículo, vimos varios ejemplos de solicitudes POST con el cliente OkHttp .

Como de costumbre, los ejemplos de código están disponibles en GitHub.