Переопределение дополнительных и обязательных полей

При использовании Retrofit я знаю, что вы можете использовать @FieldMap Map<String, String> options для указания необязательных запросов.

Скажем, что у меня есть api-вызов, у которого было 2 обязательных поля и 3 необязательных поля.

Как мне отформатировать эти вызовы?

Будет ли это что-то вроде

Call<Response> getStuff(@Query("user_id") String userId, @Query("password") String password, @FieldMap Map<String, String> options)

или все это будет единственной @FieldMap, например:

Call<Response> getStuff(@FieldMap Map<String, String> options)

и с помощью этой опции вы просто заполните необходимые поля, а затем используйте null для опций?

Ответ 1

@FieldMap и @Query params поддерживают необязательные поля. Как вы упомянули, просто передайте null, если вы не хотите передавать значение.

Ответ 2

Retrofit2 (в отличие от Retrofit1) не принимает нулевые значения в @FiledMap (выдает исключение). Нулевые значения, передаваемые в параметры @Field/@Query, игнорируются (не отображаются в http-запросе)

Ответ 3

Я застрял в вопросе на несколько часов и наконец решил вопрос.

Я буду использовать Kotlin, чтобы ответить на вопрос.

Как сказал @Ryan, вы также можете просто передать null в качестве значения в Kotlin:

fun getStuff(@Query("user_id") userId: String? = null ,
                 @Query("password") password: String? = null,
                 @FieldMap options: Map<String, String>? = null): Call<Response>

Если у вас есть дополнительные поля, такие как @Query("page") int page в Java, есть кое-что, что вы должны иметь в виду:

В Java вы не можете передать значение null для примитивных типов данных, таких как int, float, long и т.д.

Вместо этого используйте Integer, Float, Long и т.д., И компилятор не будет раздражительным.

Поэтому правильный ответ: @Query("page") Integer page.

А в Kotlin вы не можете передать значение null для примитивных типов данных, таких как Int, Float, Long и т.д.

Используя Int? вместо Int и Retrofit будут игнорировать их при сборке запроса.

Это происходит потому, что, хотя Kotlin компилируется в JVM, ненулевые значения этого типа представляются в виде значений типа примитива int, а также значения NULL, например Int? Тип в штучной упаковке.

Так в Kotlin, обнуляемый Int Int? могу решить этот вопрос.

Для получения дополнительной информации о примитиве Kotlin см.: В чем разница между Int и Integer в Kotlin?

Я надеюсь, что это помогло кому-то тоже.