Ответ 1
@FieldMap
и @Query
params поддерживают необязательные поля. Как вы упомянули, просто передайте null
, если вы не хотите передавать значение.
При использовании 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
для опций?
@FieldMap
и @Query
params поддерживают необязательные поля. Как вы упомянули, просто передайте null
, если вы не хотите передавать значение.
Retrofit2 (в отличие от Retrofit1) не принимает нулевые значения в @FiledMap
(выдает исключение). Нулевые значения, передаваемые в параметры @Field
/@Query
, игнорируются (не отображаются в http-запросе)
Я застрял в вопросе на несколько часов и наконец решил вопрос.
Я буду использовать 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?
Я надеюсь, что это помогло кому-то тоже.