簡體   English   中英

改造可選和必填字段

[英]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 中,您不能為intfloatlong等原始數據類型傳遞 null 。

相反,使用IntegerFloatLong等,編譯器就不會脾氣暴躁。

所以正確答案是: @Query("page") Integer page

在 Kotlin 中,您不能為IntFloatLong等原始數據類型傳遞 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM