改进可选和必填字段

时间:2016-05-03 23:55:57

标签: 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)

或整个事情是否像@FieldMap一样:

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

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

4 个答案:

答案 0 :(得分:24)

@FieldMap@Query参数都支持可选字段。正如您所提到的,如果您不想传递值,只需传递null

答案 1 :(得分:2)

我坚持了几个小时,终于解决了这个问题。

我将用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>

如果您在Java中有一个诸如@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原语的更多信息,请参见:What is the difference between Int and Integer in Kotlin?

我希望它也能帮助别人。

答案 2 :(得分:0)

Retrofit2(与Retrofit1不同)不接受@FiledMap中的空值(引发异常)。 传递给@Field / @Query参数的空值将被忽略(不会出现在http-request中)

答案 3 :(得分:0)

是的,瑞恩说得对。

在 Java 中,您的调用示例将是:

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

记住这将与“字符串”完美配合 如果您想将“int”或“float”保留为可选,请不要使用原始数据类型,如 int、float、long 等。而是使用 Integer、Float、Long 等
所以你的例子是可选的整数和浮点数:

Call<Response> getStuff(@Query("user_id") Integer userId, @Query("password") Float password, @FieldMap Map<String, String> options);

此语法将采用跳过整数值(如果需要,请在服务器端处理)。