Retrofit 2 发送一个空数组

4

我正在通过这个Retrofit接口将整数数组发送到后端:

@PATCH("save/ids")
@FormUrlEncoded
Call<Output> saveIds(@Field("ids[]") List<Integer> ids);

当我有一个带有一些项的ArrayList时,这个方法是有效的。但是服务器想要一个名为ids的空数组来重置所有id。当我发送一个空数组时,Retrofit不会发送该数组 - 它只是丢弃了该参数。

我创建我的ArrayList如下:

List<Integer> ids = new ArrayList<>();
for (FooObjects object : listOfIds) {
    if (object.isEnabled()) {
        ids.add(object.getId());
    }
}

如何发送一个空数组?


你将要发送的列表的确切有效载荷是什么?类似于ids=[1,2,3]ids=[]吗? - Lyubomyr Shaydariv
应该是ids=[],但由于ids数组为空,Retrofit不会发送ids=[]。 - user1007522
所以你似乎有一些期望。实际上,Retrofit会发送ids[]=foo&ids[]=bar&ids[]=baz而不是ids[]=[foo,bar,baz] - Lyubomyr Shaydariv
我曾经遇到过同样的问题,但没有找到任何合适的解决方案。如果列表为空,则使用空值发送RequestBody可以解决该问题。 - Prashant
2个回答

1

最简单的方法是更改Gson转换器的设置,使其序列化null值 - 这将发送"ids":[],符合您的要求。

使用GsonBuilder创建一个新的Gson实例,并使用serializeNulls():

private Gson gson = new GsonBuilder().serializeNulls().create();

您可以在设置Retrofit实例时将此传递给Retrofit构建器:
private Retrofit.Builder builder =
        new Retrofit.Builder()
                .baseUrl(API_URL)
                .addConverterFactory(GsonConverterFactory.create(gson));

有很多广泛的配置选项可用,并在Gson文档中列出:https://github.com/google/gson/blob/master/UserGuide.md


不适用于我。 - Felix Stanley

1

我曾经遇到这种情况,通过告诉我合作的后端开发人员接受包含空字符串的列表,并将其视为空列表来处理,我成功地解决了它。在服务的参数中加入了简单的条件判断。

if(list.isEmpty()) listOf(“”) else list

这对我有用 - prabhatsdp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接