web-dev-qa-db-ja.com

オプションおよび必須フィールドの改造

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を使用しますか?

18
Orbit

@FieldMapおよび@Query paramsはどちらもオプションのフィールドをサポートしています。あなたが述べたように、値を渡したくない場合は単にnullを渡します。

32
Ryan

私は数時間問題に巻き込まれ、最終的に問題を解決しました。

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では、intfloatlongなどのプリミティブデータ型にnullを渡すことはできません。

代わりに、IntegerFloatLongなどを使用すると、コンパイラーは不機嫌になりません。

正解は@Query("page") Integer pageです。

また、Kotlinでは、IntFloatLongなどのプリミティブデータ型にnullを渡すことはできません。

IntおよびRetrofitの代わりに_Int?_を使用すると、リクエストのアセンブル時にそれらが無視されます。

これは、KotlinがJVMでコンパイルしている間、このタイプのnullにできない値はプリミティブタイプintの値として表され、_Int?_のようなnullにできる値はボックス型です。

Kotlinでは、null許容のInt Intですか?この質問を解決できます。

Kotlinプリミティブの詳細については、次を参照してください。 KotlinのIntとIntegerの違いは何ですか?

それが誰かにも役立つことを願っています。

8
ininmm

Retrofit2は(Retrofit1とは異なり)@FiledMapでnull値を受け入れません(例外がスローされます)。 @Field/@Queryパラメータに渡されたnull値は無視されます(http-requestには表示されません)

0
Vasily Makarov