使用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
作为选项吗?
答案 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中,您不能为int
,float
,long
等原始数据类型传递null。
相反,请使用Integer
,Float
,Long
等,编译器不会显得脾气暴躁。
正确的答案是:@Query("page") Integer page
。
在Kotlin中,您不能为Int
,Float
,Long
等原始数据类型传递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);
此语法将采用跳过整数值(如果需要,请在服务器端处理)。