Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 仅当表单字段在OkHttp中不为空时添加表单字段_Java_Okhttp_Okhttp3 - Fatal编程技术网

Java 仅当表单字段在OkHttp中不为空时添加表单字段

Java 仅当表单字段在OkHttp中不为空时添加表单字段,java,okhttp,okhttp3,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

我被要求重构一些向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调用,用于创建表单
    任务
    状态
  • 另一个url调用,用于使用
    时间
    障碍
  • 然后是另一个url调用,只允许重复出现

但由于它们都属于同一个url,我决定将它们合并为一个函数,因为我有一个想法。虽然我的想法似乎有点落伍。如果(例如,
任务
状态
重复
都是
空的
,那么它将只创建一个只有
花费的时间
障碍
的表单。

看起来您的
任务
变量是一个具有字符串键和对象值的某种映射。以下是您的解决方案:

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();
这将遍历所有表单键,并在将值添加到表单生成器之前检查值是否为null


如果您愿意,您可以将其更改为使用,这可能会更高效、更短。

Neeto!我认为okhttp的FormBody.Builder由于包私有内容而无法实例化。我的错是误解了它。有了您的解决方案,我将只使用
bodyBuilder.add(name,String.valueOf(value)
将其添加到builder中。谢谢,伙计!@RigoSarmiento,没问题。随时乐意帮助。