java - 仅当 OkHttp 中表单字段不为 null 时才添加表单字段

标签 java 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 调用,具有 taskstatus 形式
  • 另一个具有 spent_timeimpediments 的网址调用
  • 然后另一个网址调用仅具有重复发生

但是由于它们都属于同一个 url,所以我决定将它们组合成一个函数,因为我有一个想法。虽然我的想法似乎有些不足。我该如何做到这一点,以便如果(例如)taskstatusreoccurringnull,那么它只会创建一个只有spent_timeimpediments的表单?

最佳答案

看起来您的 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 ,这可能更高效、更短。

关于java - 仅当 OkHttp 中表单字段不为 null 时才添加表单字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54068226/

相关文章:

java - 如何检查电子邮件是否存在,除了请求的用户之外?

java - 如何在 Apache Lucene 中将 PhraseQuery 与 RangeQuery 结合起来?

java - Okhttp3 - 调用 API 后出现 IndexOutOfBoundsException

java - OkHttp 是否在重定向时发送授权和其他可能敏感的 header ?

java - 实现工具栏调用空对象引用

java - 在 Java 8 中实现两个具有相同签名的默认方法的两个接口(interface)

java - 在大文件中找到具有相同哈希码的两个单词 - 奇怪的输出

java - 使用 OkHttp 库中的拦截器

java - Android - 如何使用 okhttp-retrofit 从保存的缓存中使特定 URL 无效/删除?