Search code examples
javaokhttpunirest

Does OkHttp have something easier similar to Unirest's field method for creating a RequestBody?


Instead of Unirest, I'm using okhttp because there are responses where I only need the header so I don't need to download it using its ResponseBody.string() method.

I am however having a hard time building my requests for POSTs with a RequestBody. In Unirest, you only need to use thefieldmethod to add to the itsRequestBody`:

Unirest.post(baseUrl + "/api/user")
                .header("Authorization", token)
                .field("id", id)
                .field("property", property)
                .asJson();

But in OkHttp, if I want to add a RequestBody I have to do this (in most cases where I don't really have a json lying around):

OkHttpClient httpClient = new OkHttpClient();
Map<String, Object> payload = new HashMap<>();
payload.put("user_id", userId);
payload.put("client_id", clientId); 
payload.put("type", status.getStatus());
payload.put("description", ""); 
payload.put("duration", 0); 

String requestBody = new ObjectMapper().writeValueAsString(payload);

Call call = httpClient.newCall(
        new Request.Builder()

                .url(url) 
                .header("Authorization", tempToken)
                .post(RequestBody.create(MediaType.get("application/json"), requestBody))
                .build()
);

I'm using a Map to create a json string because this is the easiest way for me to create a json.

Does OkHttp have something easier similar to Unirest's field method for creating a RequestBody?


Solution

  • I found okhttp has FormBody which has a Builder:

    Call call = httpClient.newCall(
            new Request.Builder()
                    .url(url)
                    .header("Authorization", tempToken)
                    .post(new FormBody.Builder()
                            // TODO user getId()
                            .add("id","")
                            .add("custom_fields", field)
                            .build())
                    .build()
    );