使用 Retrofit 在 Multipart 中发送 name/value 对作为对象

Send a name/value pair as object in Multipart using Retrofit

在我的代码中,我必须发出 MultipartForm-Data PUT 请求来更新服务器中的对象,它应该是 Multipart,因为用户可能会将图像与数据一起发送。

为了做到这一点,我目前正在使用 Retrofit,因为它是一个我非常习惯的库,并且可以将图像发送到服务器。

但是,服务器端发生了变化,现在必须发送的参数之一是:

{"step":
    {"type":"begin"}
}

然而事实证明,做到这一点出奇地困难。

我尝试过的方法包括将其作为 MultipartTypedOutput、手写字符串和转换为字符串的 JSONObject 进行传递,所有这些都给了我:

retrofit.RetrofitError: 400 Bad Request

正在使用的 URL 是正确的,我已经与维护服务器的人员进行了双重检查并且它正在到达服务器,但是 "step" 对象不正确。

我也试过将它作为 NameValuePair、Map 和 HashMap 传递,所有这些都给了我:

retrofit.RetrofitError: Part body must not be null.

@FieldPart 看起来很完美,但与 Multipart 不兼容,那么有没有办法用 Retrofit 做到这一点?

我目前的 PUT 方法是这样的:

@Headers({
    "Connection: Keep-Alive",
    "Accept-Language: en-US"
})
@Multipart
@PUT("/0.1/user/{id}")
String updateUser(@Path("id") String userId, @Part("step") Map<String,String> type);

其中地图类型已更改为我之前提到的所有类型。

你实际上做的是正确的,只是需要一些快速修复。我有两个建议给你, 1. 你可以像这样创建一个内部类

public class Example {

@SerializedName("type")
@Expose
private String type;

/**
* 
* @return
* The type
*/
public String getType() {
return type;
}

/**
* 
* @param type
* The type
*/
public void setType(String type) {
this.type = type;
}

}

在这种情况下,您的 api 看起来像

@Multipart
@PUT("/0.1/user/{id}")
String updateUser(@Path("id") String userId, @Part("step") Example exp);
  1. 或者,您可以使用 JsonObject,这不是您已经使用的 Apache JSONObject。它是 google gson object,属于 com.google.gson 的包。在这里您需要执行以下操作, JsonObject settingObject = new JsonObject(); settingObject.addProperty("type", "begin"); 在这种情况下,它将是

    String updateUser(@Path("id") String userId, @Part("step") JsonObject obj);

这就是您所需要的,顺便说一句,您也可以一劳永逸地设置 header,为什么要在 api 上定义它呢?

我仍然不明白问题出在哪里,因为 "Part body must not be null" 即使在尝试 Ankush 提到的内容时也会发生。

不管怎样,后来跟几个朋友和几个人脉扩展,我得到了以下解决方案:

@Headers({
    "Connection: Keep-Alive",
    "Accept-Language: en-US"
})
@Multipart
@PUT("/0.1/user/{id}")
String updateUser(@Path("id") String userId, @Part("step[type]") String type);

据我所知,retrofit 的文档中没有提到这一点,但它确实有效。