改造字符串数组发送对象表示而不是请求中的值。
Retrofit string array sending object representation instead of value in request.
我在我的 Android 项目中使用带有 Jackson 转换器的 Retrofit 2,请求如下:
@FormUrlEncoded
@PATCH("foo/{id}")
Call<FooModel> apiCallWithArrayOfStrings(@Path("id") int id, @Field("array_of_strings") List<String> array);
以下是我传递给接口方法的值:
// the array of strings @Field param
ArrayList<String> arrayOfStrings = new ArrayList<>();
arrayOfStrings.add("1.2");
// the id param
int id = 2;
我 运行 应用程序让 API 调用执行请求,然后通过 Charles 检索请求。
问题来了。正在使用对象引用发送请求参数 "array_of_strings",而不是数组对象的实际值:
// charles request shows:
array_of_strings [I@41fea508
// instead of:
array_of_stings ["1.2"]
如何让 Retrofit/Jackson 使用数组对象的值而不是对象引用值?
我想你应该在 array_of_strings
字段名中添加 []
方括号,这样 Retrofit 就会知道你要发送一个数组并将它正确地转换为数组字段:
@FormUrlEncoded
@PATCH("foo/{id}")
Call<FooModel> apiCallWithArrayOfStrings(@Path("id") int id, @Field("array_of_strings[]") List<String> array);
通过 rom4ek 在这个答案中的评论,使用 ArrayList<String>
作为参数类型是解决方案。 Jackson 必须以不同于数组或列表的方式序列化 ArrayList。
@FormUrlEncoded
@PATCH("foo/{id}")
Call<FooModel> apiCallWithArrayOfStrings(@Path("id") int id, @Field("array_of_strings") ArrayList<String> array);
我在我的 Android 项目中使用带有 Jackson 转换器的 Retrofit 2,请求如下:
@FormUrlEncoded
@PATCH("foo/{id}")
Call<FooModel> apiCallWithArrayOfStrings(@Path("id") int id, @Field("array_of_strings") List<String> array);
以下是我传递给接口方法的值:
// the array of strings @Field param
ArrayList<String> arrayOfStrings = new ArrayList<>();
arrayOfStrings.add("1.2");
// the id param
int id = 2;
我 运行 应用程序让 API 调用执行请求,然后通过 Charles 检索请求。
问题来了。正在使用对象引用发送请求参数 "array_of_strings",而不是数组对象的实际值:
// charles request shows:
array_of_strings [I@41fea508
// instead of:
array_of_stings ["1.2"]
如何让 Retrofit/Jackson 使用数组对象的值而不是对象引用值?
我想你应该在 array_of_strings
字段名中添加 []
方括号,这样 Retrofit 就会知道你要发送一个数组并将它正确地转换为数组字段:
@FormUrlEncoded
@PATCH("foo/{id}")
Call<FooModel> apiCallWithArrayOfStrings(@Path("id") int id, @Field("array_of_strings[]") List<String> array);
通过 rom4ek 在这个答案中的评论,使用 ArrayList<String>
作为参数类型是解决方案。 Jackson 必须以不同于数组或列表的方式序列化 ArrayList。
@FormUrlEncoded
@PATCH("foo/{id}")
Call<FooModel> apiCallWithArrayOfStrings(@Path("id") int id, @Field("array_of_strings") ArrayList<String> array);