在使用Retrofit 2的多部件PartMap请求中为同一个参数使用多个值

时间:2017-06-06 10:20:33

标签: java android hashmap retrofit2 multipart

我想在多部分查询中发送同一参数的多个值。这是我的代码:

接口:

@Multipart
@POST("user")
Observable<Void> updateUser(@PartMap() Map<String, RequestBody> partMap, @Part MultipartBody.Part photo);

此请求允许我使用新图片和一些参数更新用户。在参数中,我可以使用名为&#34;技能[]&#34;的参数指定用户的技能。要指定可以在数量上变化的参数,我使用HashMap;但是对于HashMap,我无法使用相同的名称指定多个参数。

即。我不能这样做:

for(Integer skill : skills) {
    RequestBody body = RequestBody.create(MediaType.parse("multipart/form-data"), skill.toString());
    map.put("skills[]", body);
}

因为地图只接受同一个键的一个值。

如何指定参数的多个值。使用Postman来测试请求我没有问题。

我尝试使用HashMap<String, List<RequestBody>>代替:

List<RequestBody> bodies = new ArrayList<>();
for(Integer skill : skills) {
    RequestBody body = RequestBody.create(MediaType.parse("multipart/form-data"), skill.toString());
    bodies.add(body);
}
map.put("skills[]", bodies);

但它似乎不受支持。创建的查询包含请求正文的空值:

Content-Disposition: form-data; name="skills[]"
Content-Transfer-Encoding: binary
Content-Type: application/json; charset=UTF-8
Content-Length: 16

[null,null,null]

2 个答案:

答案 0 :(得分:2)

修复了Andy Developer

我仍然使用HashMap<String, RequestBody>,但我提供了不同的参数名称:

for(int i = 0; i < skills.size(); i++) {
    Integer skill = skills.get(i);
    RequestBody body = RequestBody.create(MediaType.parse("multipart/form-data"), skill.toString());
    map.put("skills[" + i + "]", body);
}

答案 1 :(得分:-1)

使用它来创建文本RequestBody对象:

  RequestBody userPhone = RequestBody.create(MediaType.parse("text/plain"), phoneNumber);
  RequestBody userEmail = RequestBody.create(MediaType.parse("text/plain"), email);

希望这有帮助。