是否可以使用Retrofit通过Multipart发送String[]?

11

我正在开发一个应用程序,在某个点上,用户必须从列表中选择任意数量的国家,然后我必须通过多部分发送所选的名称。

我没有上传任何文件与String[]一起,但如果不是多部分,就没有上传信息的路线,而且我无法控制Web服务器的操作方式。

我尝试将它简单地作为数组、ArrayList和JsonArray发送,例如:

@Headers({
    "Connection: Keep-Alive",
})
@Multipart
@PUT("/user/{id}")
String updateUser(@Path("id") int userId, @Part("user[countries]") String[] countries);

我也尝试了这个解决方案,但我要么误解了它,要么它不起作用。这是我尝试使用的代码:

ArrayList<String> countries = CountryManager.getInstance().getSelectedCountryIds();
RequestBody requestBody;
LinkedHashMap<String, RequestBody> hashMap = new LinkedHashMap<>();

for(int i = 0; i < countries.size(); i++) {
    requestBody = RequestBody.create(MediaType.parse("text/plain"), countries.get(i));
    hashMap.put("countries["+i+"]", requestBody);
}

并相应地改变翻新方法:

@Headers({
    "Connection: Keep-Alive",
})
@Multipart
@PUT("/user/{id}")
String updateUser(@Path("id") int userId, @PartMap() Map countries);

然而,在我所有的尝试中,我都得到了错误信息retrofit.RetrofitError: Part body must not be null。

我也提到过,Retrofit的ChangeLog中提到了“新功能:支持使用OkHttp的MultipartBody.Part迭代和数组@Part参数”,但经过一番挖掘,我发现给出的示例相当令人困惑,以至于我不确定如何将其实现在我的代码中,并且无法找到任何教程甚至提到在多部分中发送数组。

这种事情是不可能的吗?


使用 PartMap 注释的解决方案似乎是正确的。我在一些应用程序中使用它,效果很好。你确定所有国家都不为 null 吗? - Pablo
4个回答

10

我知道我回答晚了。在multipart中发送ArrayList可以使用@Query("someKey[]")。这是一个可行的示例。

@Multipart
    @POST("./")
    Call<JsonElement> addSubEvent(@Part(EndAPI.USE_CASE) RequestBody useCase,
                                  @Query("event_id[]") ArrayList<String> event_id,
                                  @Query("user_id[]") ArrayList<String> user_id,
                                  @Query("name[]") ArrayList<String> name,
                                  @Query("date_time[]") ArrayList<String> date_time,
                                  @Part("token") RequestBody token,
                                  @Part MultipartBody.Part... profilePic);

希望这能帮助到正在寻找答案的人。


如何在 PHP 中解析 ArrayList - bipin

10
创建包含多个部分的列表,用作数组列表。
List<MultipartBody.Part> descriptionList = new ArrayList<>();
descriptionList.add(MultipartBody.Part.createFormData("param_name_here", values));

以下是Retrofit服务接口中的函数。

@PUT("/")
@Multipart
Call<ResponseBody> uploadPhotos(
        @Part MultipartBody.Part placeId,
        @Part MultipartBody.Part name,
        @Part List<MultipartBody.Part> desclist, // <-- use such for list of same parameter
        @Part List<MultipartBody.Part> files  // <-- multiple photos here
);

希望能对某人有所帮助。干杯... !!!


它已经成功地通过Multipart传递了字符串列表。谢谢@Siddher - RamaKrishnan
节省了我很多时间,感谢您的解决方案! - hetsgandhi

2

只需使用 @Part("items[]") List items

像这样:

List<String> items = new ArrayList();
    items.add("1");
    items.add("2");
    items.add("3");

@Multipart
@POST("/")
Call<Result> yourMethod(@PartMap() Map<String, RequestBody> partMap, @PartMap() Map<String, RequestBody> map, @Part MultipartBody.Part file, @Part("items[]") List<String> items);

如何在 PHP 中解析这个数组? - bipin

-1

这是可能的,而且还可以使用多部分方式实现。将您的数组转换为JSON字符串并将其作为单个部分添加,一旦在服务器端接收到该JSON,只需进行反序列化即可。


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