[英]How to mention “Optional”, and “Required” fields in response model class of retrofit2 in android
[英]Retrofit optional and required fields
使用 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
參數都支持可選字段。 正如您所提到的,如果您不想傳遞值,只需傳遞null
即可。
我在這個問題上停留了幾個小時,終於解決了這個問題。
我將使用 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 中,您不能為int
、 float
、 long
等原始數據類型傳遞 null 。
相反,使用Integer
、 Float
、 Long
等,編譯器就不會脾氣暴躁。
所以正確答案是: @Query("page") Integer page
。
在 Kotlin 中,您不能為Int
、 Float
、 Long
等原始數據類型傳遞 null 。
使用Int?
而不是Int
和 Retrofit 將在組裝請求時忽略它們。
這是因為當 Kotlin 在 JVM 上編譯時,這種類型的不可空值被表示為原始類型int
值,可空值如Int?
是盒裝類型。
那么在 Kotlin 中,一個可為空的 Int Int? 可以解決這個問題。
有關 Kotlin 原語的更多信息,請參閱: Kotlin 中的 Int 和 Integer 有什么區別?
我希望它也幫助了某人。
Retrofit2(與 Retrofit1 不同)不接受@FiledMap
空值(拋出異常)。 傳遞給@Field
/ @Query
參數的空值被忽略(不出現在 http 請求中)
是的 ryan 說得對。
在 Java 中,您的調用示例將是:
Call<Response> getStuff(null,null,@FieldMap Map<String, String> options);
請記住,如果您想將“int”或“float”保留為可選,則這將與“String”完美配合,不要使用原始數據類型,如 int、float、long 等。相反,請使用 Integer、Float、Long 等
所以你的帶有可選整數和浮點數的示例將是:
Call<Response> getStuff(@Query("user_id") Integer userId, @Query("password") Float password, @FieldMap Map<String, String> options);
此語法將采用跳過整數值(如果需要,在服務器端處理它)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.