【问题标题】:Sending ArrayList<String> as part using Retrofit Android使用 Retrofit Android 发送 ArrayList<String>
【发布时间】:2020-07-18 11:10:32
【问题描述】:

尝试将 ArrayList 与图像和其他详细信息一起发送

选中复选框时获取列表项

ArrayList<String> intrest = new ArrayList<>();
 switch (buttonView.getId()) {
            case R.id.business:
                if (business.isChecked()) {
                    interest.add(String.valueOf(business.getText()));
                }
                break;
            case R.id.politics:
                if (politics.isChecked()) {
                    interest.add(String.valueOf(politics.getText()));
                }
                break;
            case R.id.entertainment:
                if (entertainment.isChecked()) {
                    interest.add(String.valueOf(entertainment.getText()));
                }
                break;

服务器响应

{"message":"Created  successfully","data":{"interest":[],"showAds":true,"description":"ghbjbjj",
"title":"title","link":"link","image": "imageURL"}}

接口类


@Multipart
    @POST("/api/post")
    Call<ResponseBody> createPost(
            @Part("description") RequestBody description,
            @Part("title") RequestBody title,
            @Part("link") RequestBody link,
            @PartMap Map<String, RequestBody> interest,
            @PartMap Map data,
            @Part MultipartBody.Part adsImage
    );
@NonNull
    private RequestBody createPartFromString(String descriptionString) {
        return RequestBody.create(descriptionString,
                okhttp3.MultipartBody.FORM);
    }


Map<String, RequestBody> partMap = new HashMap<>();
        for (int i = 1; i < interest.size(); i++) {
            partMap.put("interest", createPartFromString(interest.get(i)));
        }

 Call<ResponseBody> call = RetrofitClient.getInstance()
                .getApi()
                .createPost(
                        createPartFromString(title),
                        createPartFromString(link),
                        partMap,
                        prepareFilePart("image", selectedImage)
                );

除了 ArrayList 之外,其他所有内容都会发送到服务器。

如何将 ArrayList 作为一部分传递?

【问题讨论】:

  • 在代码中看不到任何列表
  • @Joni 将列表添加到问题中
  • 如何将列表附加到请求中?
  • 调用正文中的partMap。
  • 啊,我看到您只将列表的最后一个元素放入partMap。服务器希望如何接收列表?它可以是多个部分,也可以是单个部分中的 JSON 编码列表?

标签: java android server retrofit2 endpoint


【解决方案1】:

(我没试过,但是这个应该工作)

更改请求原型定义,使 interestPart 而不是 PartMap:

@Part("interest") List<String> interest,

然后将兴趣作为字符串列表传递。无需将字符串转换为RequestBodys,Retrofit 为您完成。

Call<ResponseBody> call = RetrofitClient.getInstance()
            .getApi()
            .createPost(
                    createPartFromString(title),
                    createPartFromString(link),
                    interest,
                    prepareFilePart("image", selectedImage)
            );

【讨论】:

  • 我尝试了您的解决方案并将兴趣发送到服务器,但格式不正确。 "title": "Title", "interest": [ "\"Business\"", "\"Politics\"", "\"Technology and Gadgets\"" ] 预期结果 "title": "Title", "interest": [ "Business", "Politics", "Technology and Gadgets"] @Joni 抱歉回复晚了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-18
  • 2020-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多