改进可选和必填字段

Orb*_*bit 16 android retrofit retrofit2

使用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)
Run Code Online (Sandbox Code Playgroud)

或者整个事情是一个单独的@FieldMap:

Call<Response> getStuff(@FieldMap Map<String, String> options)

使用此选项,您只需填写必填字段然后null用于选项吗?

Rya*_*yan 29

@FieldMap@Queryparams都支持可选字段.正如您所提到的,null如果您不想传递值,只需传递即可.

  • 我通常建议使用显式的`@ Query`字段,因为它们可以用来自我记录端点,但是`@ FieldMap`也应该完成这项工作. (3认同)

小智 6

我在这个问题上停留了几个小时,终于解决了这个问题。

我将用Kotlin回答这个问题。

正如@Ryan所说,您还可以将nullKotlin中的值作为传递值:

fun getStuff(@Query("user_id") userId: String? = null ,
                 @Query("password") password: String? = null,
                 @FieldMap options: Map<String, String>? = null): Call<Response>
Run Code Online (Sandbox Code Playgroud)

如果您有@Query("page") int pageJava 等可选字段,则应牢记以下几点:

在Java中,你不能传递null类型喜欢原始数据intfloatlong,等。

相反,使用IntegerFloatLong等编译器会不会是脾气暴躁。

因此正确的答案是:@Query("page") Integer page

而在科特林,你不能传递null类型喜欢原始数据IntFloatLong,等。

在组装请求时,使用Int?而不是Intand Retrofit将忽略它们。

这是因为,当Kotlin在JVM上进行编译时,此类型的不可为null的值将表示为原始类型的int值,而可为null的值将类似于Int?盒装Type。

那么在Kotlin中,可以为null的Int Int吗?可以解决这个问题。

有关Kotlin原语的更多信息,请参见:Kotlin中Int和Integer有什么区别?

我希望它也能帮助到别人。