只有在 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 调用具有
task
和 status
形式
- 另一个 url 呼吁
spent_time
和 impediments
- 然后另一个 url 要求只有
reoccurring
但由于它们都属于同一个 url,我决定将它们合并为一个函数,因为我有一个想法。虽然看起来我的想法有点不足。我如何做到这一点,如果(例如)task
、status
和 reoccurring
是 null
,那么它只会创建一个仅 的表单有 spent_time
和 impediments
?
看起来您的 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,这可能更高效、更短。
有人要求我重构一些向 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
形式
- 另一个 url 呼吁
spent_time
和impediments
- 然后另一个 url 要求只有
reoccurring
但由于它们都属于同一个 url,我决定将它们合并为一个函数,因为我有一个想法。虽然看起来我的想法有点不足。我如何做到这一点,如果(例如)task
、status
和 reoccurring
是 null
,那么它只会创建一个仅 的表单有 spent_time
和 impediments
?
看起来您的 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,这可能更高效、更短。