gpt4 book ai didi

java - 将 Java 对象传递到 Retrofit 中未正确处理

转载 作者:行者123 更新时间:2023-12-02 00:16:37 28 4
gpt4 key购买 nike

我正在尝试上传一组文件、一个授权 header 和一个 java 对象。

问题是后端的设置方式,我不想为我的 DocumentUpdateObject 命名 @Part 注释。有没有办法允许 @Part(null) 或将我的自定义对象 (DocumentUpdateObject) 转换为 MultipartBody.Part?我将发布一些示例来更好地解释。

文件数组在技术上是可选的,因此下面的语句非常有效。

@PUT("document/")
Call<ResponseBody> updateDocument(
@Header("Authorization") String token,
@Body DocumentUpdateObject object);

我想要的功能与此类似:

@Multipart
@PUT("document/")
Call<ResponseBody> updateDocumentDocs(
@Header("Authorization") String token,
@Part DocumentUpdateObject object,
@Part ArrayList<MultipartBody.Part> files);

关于第二个参数,如果我不给@Part命名,@Part("object"),那么它会失败。如果我给 @Part 一个名称,那么后端将无法正确读取它。我想阅读它类似于上面的@Body。

是否有将对象转换为 MultipartBody.Part 的代码(如果可以解决问题)?我见过几个解决方案,但它们似乎只适用于简单的单个字符串请求。我的 DocumentUpdateObject 有 5 个可变参数,其中另一个对象有 5 个以上的可变参数。我考虑过 MultipartBody.Builder,但它似乎无法处理嵌套对象。

编辑:这一切都是以 JSON 格式读取的

编辑2:基本上,我能够通过分解对象来获取要发送的部分对象,但我无法正确处理其中的最终对象。

//These request bodies send properly
RequestBody defncynbrBody =
RequestBody.create(deficiencyNbr, MediaType.parse("application/json"));
RequestBody assetBody =
RequestBody.create(assetnbr, MediaType.parse("application/json"));
RequestBody subassetBody =
RequestBody.create(subassetnbr, MediaType.parse("application/json"));

//This object down here still is unable to be recieved properly
Gson gson = new Gson();
String json = gson.toJson(add);
RequestBody addBody =
RequestBody.create(json, MediaType.parse("application/json"));

编辑3

这不能正常工作

   Content-Disposition: form-data; name="defncy"
2019-09-25 10:20:24.123 D/OkHttp: Content-Transfer-Encoding: binary
2019-09-25 10:20:24.123 D/OkHttp: Content-Type: application/json; charset=utf-8
2019-09-25 10:20:24.123 D/OkHttp: {"defncytyp":"LOW","descr":"details are here this",
"duedate":"2019-09-23","maintlogcattyp":"INTR","title":"Newest one"}

但是这个效果很好。

2019-09-25 10:31:58.404 D/OkHttp: Content-Type: application/json; charset=UTF-8
2019-09-25 10:31:58.405 D/OkHttp: {"defncy":{"defncytyp":"LOW","descr":"details are here this",
"duedate":"2019-09-23","maintlogcattyp":"INTR","title":"Newest on"},"assetnbr":4,"defncynbr":18,"subassetnbr":0,"usrs_assigned":0}

最佳答案

您的后端将使用单个 key 接受零件,主要是在后端,我们将多个零件文件视为零件[]。
因此,尝试以这种方式构建您的零件对象:

@NonNull
private List<MultipartBody.Part> getParts(@NonNull String key, @NonNull List<File> files) {
final MultipartBody.Builder builder = new MultipartBody.Builder();
for (File file : files) {
final RequestBody body = RequestBody.create(MediaType.parse("image/*"), file);
builder.addFormDataPart(key, file.getName(), body);
}
return builder.build().parts();
}

然后调用您的updateDocumentDocs方法

@Multipart
@PUT("document/")
Call<ResponseBody> updateDocumentDocs(
@Header("Authorization") String token,
@Part DocumentUpdateObject object,
@Part List<MultipartBody.Part> files);

关于java - 将 Java 对象传递到 Retrofit 中未正确处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58086218/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com