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

时间:2016-05-14 05:45:01

标签: android multipartform-data retrofit2

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

我没有使用String []上传任何文件,但没有路由可以上传信息而不是多部分,我对Web服务器的运行方式没有任何说法。

我试图将它简单地发送为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:部分正文不能为空。

我还提到改造的ChangeLog使用OkHttp的@Part提到“New:支持可迭代和数组MultipartBody.Part参数”,但经过一些挖掘后,我发现给定的例子相当令人困惑到了我不确定如何在我的代码中实现它并且无法找到甚至提到在多部分中发送数组的教程。

这样的事情根本不可能吗?

4 个答案:

答案 0 :(得分:5)

我知道我迟到了这个答案。您可以使用@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);

希望这将有助于寻求答案的人。

答案 1 :(得分:4)

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

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

希望它可以帮助某人。欢呼... !!!

答案 2 :(得分:1)

只需使用@Part(&#34; items []&#34;)列出项目

像这样:

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

答案 3 :(得分:0)

这是可能的,并且也可以使用多部分功能,只需将您的Array转换为Json String并将其添加为单个部分,一旦在服务器端收到此Json,就对其进行反序列化。