只有在 OkHttp 中不为 null 时才添加表单字段

Only add form field if it is not null in OkHttp

有人要求我重构一些向 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()

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

但由于它们都属于同一个 url,我决定将它们合并为一个函数,因为我有一个想法。虽然看起来我的想法有点不足。我如何做到这一点,如果(例如)taskstatusreoccurringnull,那么它只会创建一个仅 的表单有 spent_timeimpediments?

看起来您的 task 变量是某种具有字符串键和对象值的映射。这是您的解决方案:

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,这可能更高效、更短。