Retrofitを使用する場合、_@FieldMap Map<String, String> options
_を使用してオプションのクエリを指定できることを知っています。
2つの必須フィールドと3つのオプションフィールドを持つAPI呼び出しがあるとします。
これらの呼び出しをどのようにフォーマットしますか?
それは次のようなものでしょうか
_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
を渡します。
私は数時間問題に巻き込まれ、最終的に問題を解決しました。
Kotlinを使用して質問に答えます。
@Ryanが言ったように、Kotlinの値としてnull
を渡すこともできます。
_fun getStuff(@Query("user_id") userId: String? = null ,
@Query("password") password: String? = null,
@FieldMap options: Map<String, String>? = null): Call<Response>
_
Javaに@Query("page") int page
のようなオプションのフィールドがある場合、注意すべき点があります。
Javaでは、int
、float
、long
などのプリミティブデータ型にnullを渡すことはできません。
代わりに、Integer
、Float
、Long
などを使用すると、コンパイラーは不機嫌になりません。
正解は@Query("page") Integer page
です。
また、Kotlinでは、Int
、Float
、Long
などのプリミティブデータ型にnullを渡すことはできません。
Int
およびRetrofitの代わりに_Int?
_を使用すると、リクエストのアセンブル時にそれらが無視されます。
これは、KotlinがJVMでコンパイルしている間、このタイプのnullにできない値はプリミティブタイプint
の値として表され、_Int?
_のようなnullにできる値はボックス型です。
Kotlinでは、null許容のInt Intですか?この質問を解決できます。
Kotlinプリミティブの詳細については、次を参照してください。 KotlinのIntとIntegerの違いは何ですか?
それが誰かにも役立つことを願っています。
Retrofit2は(Retrofit1とは異なり)@FiledMap
でnull値を受け入れません(例外がスローされます)。 @Field
/@Query
パラメータに渡されたnull値は無視されます(http-requestには表示されません)