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

Is it possible to send a String[] through Multipart using Retrofit?

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

我没有随字符串 [] 一起上传任何文件,但是如果不是多部分就没有上传信息的途径,而且我对网络服务器的运行方式没有任何说法。

我试图简单地将其作为 Array、ArrayList 和 JsonArray 发送:

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

我也尝试过 this solution,但我误解了它,或者它不起作用。这是我尝试使用的代码:

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.

我还提到改造的 ChangeLog 提到了 "New: Support iterable and array @Part parameters using OkHttp's MultipartBody.Part",但经过一些挖掘后,我发现给定的示例非常混乱,以至于我不确定如何在我的代码无法找到甚至提到在多部分中发送数组的教程。

这种事情根本不可能吗?

只需使用@Part("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);

我知道我迟到了这个答案。您可以使用 @Query("someKey[]") 在多部分中发送 arraylist。这是工作示例。

@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);

希望对寻求答案的人有所帮助。

创建多部分列表以用作数组列表

List<MultipartBody.Part> descriptionList = new ArrayList<>();
descriptionList.add(MultipartBody.Part.createFormData("param_name_here", values));

改造后的服务界面功能如下

@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
);

希望对大家有所帮助。干杯...!!!

这是可能的,也可以使用多部分,只需将您的数组转换为 Json 字符串并将其作为单个部分添加,一旦服务器端收到此 Json,只需将其反序列化。