1. Introduction
We cover the basics of the OkHttp client in our Guide to OkHttp.
In this short tutorial, we'll look specifically at different types of POST requests for version 3.x of the client.
2. Basic POST
We can use FormBody.Builder to build a basic RequestBody to send two parameters – username and password – with a POST request:
@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 with Authorization
If we want to authenticate the request, we can use the Credentials.basic builder to add credentials to the header.
In this simple example, we'll also send a String as the body of the request:
@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 with JSON
In order to send JSON in the request body, we have to set its media type application/json. We can do that using the RequestBody.create builder:
@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. Multipart POST Request
The last example we'll look at is a POST multipart request. We need to build our RequestBody as a MultipartBody to post a file, a username, and a password:
@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 with Non-Default Character Encoding
OkHttp's default character encoding is 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")); }
If we want to use a different character encoding, we can pass it as the second parameter of the 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. Conclusion
In this short article, we saw several examples of POST requests with the OkHttp client.
As usual, the code examples are available over on GitHub.