有人要求我重构一些向 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 调用,具有
task
和status
形式 - 另一个具有
spent_time
和impediments
的网址调用 - 然后另一个网址调用仅具有
重复发生
但是由于它们都属于同一个 url,所以我决定将它们组合成一个函数,因为我有一个想法。虽然我的想法似乎有些不足。我该如何做到这一点,以便如果(例如)task
、status
和 reoccurring
为 null
,那么它只会创建一个只有spent_time
和impediments
的表单?
最佳答案
看起来您的 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/