Добавляйте только поле формы, если оно не равно нулю в OkHttp - PullRequest
0 голосов
/ 07 января 2019

Меня попросили провести рефакторинг некоторого кода, который отправляет запрос к веб-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

1 Ответ

0 голосов
/ 07 января 2019

Похоже, что ваша переменная 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 , что может быть более эффективным и коротким.

...