仅在OkHttp中不为null的情况下添加表单字段

时间:2019-01-07 03:25:11

标签: java okhttp okhttp3

我一直被要求重构一些向Web API发出请求的代码,但我不知道收到请求后会发生什么。我只需要清理发出请求的代码。我现在有这个:

FormBody formBody = new FormBody.Builder()
        .add("task", task.get("task"))
        .add("status", task.get("status"))
        .add("spent_time", task.get("spentTime"))
        .add("impediments", task.get("impediments"))
        .add("reoccurring", String.valueOf(task.get("reoccurring")))
        .build();
return new OkHttpClient().newCall(
        new Request.Builder()
                .url(buildUrl("/activities/" + task.get("id")))
                .method("POST", formBody)
                .header("Accept", "application/json")
                .build()

最初,此功能被拆分为另外三个功能。

  • 一个具有形式taskstatus的url呼叫
  • 另一个具有spent_timeimpediments的网址调用
  • ,然后另一个网址仅调用reoccurring

但是由于它们都属于同一个URL,所以我决定将它们组合为一个函数,因为我有一个主意。虽然看来我的想法还不够。我要如何做到,如果taskstatusreoccurringnull,那么它只会创建仅具有< / em> spent_timeimpediments

1 个答案:

答案 0 :(得分:1)

看起来您的task变量是具有String键和Object值的某种映射。这是您的解决方案:

Builder builder = new FormBody.Builder();
String[] names = { "task", "status", "reoccurring", "spent_time", "impediments" };
for (String name : names) {
    Object value = task.get(name);
    if (value != null)
        builder.add(name, value instanceof String ? (String) value : String.valueOf(value));
}

FormBody formBody = builder.build();

这会遍历所有表单键,并在将值添加到表单构建器之前检查值是否为空。

如果需要,可以将其更改为使用Streams,这样可能会更高效,更短。