3

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?

Rigo Sarmiento
  • 434
  • 5
  • 21

2 Answers2

1

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()
);
Rigo Sarmiento
  • 434
  • 5
  • 21
0

OkHttp doesn't have asJson. You can add a custom interceptor or implement a separate JSONObject.

Build JSON using JSONObject:

JSONObject jsonObject = new JSONObject();
try {
    jsonObject.put("username", "yourEmail@com");
    jsonObject.put("password", "yourPassword");
    jsonObject.put("anyKey", "anyValue");
} catch (JSONException e) {
    e.printStackTrace();
}

Then call OkHttp like this:

public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");

OkHttpClient client = new OkHttpClient();

String post(String url, String json) throws IOException {
  RequestBody body = RequestBody.create(JSON, json);
  Request request = new Request.Builder()
      .url(url)
      .post(body)
      .build();

  Response response = client.newCall(request).execute();
  return response.body().string();
}

The authors of okhttp use strings: https://github.com/square/okhttp/blob/master/samples/guide/src/main/java/okhttp3/guide/PostExample.java

Allen Hacks
  • 97
  • 1
  • 6