使用Retrofit在Multipart中将名称/值对作为对象发送

时间:2016-01-28 19:38:16

标签: android retrofit multipartform-data http-put

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

为了做到这一点,我目前正在使用Retrofit,因为它是一个我已经习以为常的图书馆,并且正在努力将图像发送到服务器。

然而,事情已经改变了服务器端,现在必须发送的参数之一是:

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

然而事实证明这很难做到。

我尝试过的事情包括将它作为MultipartTypedOutput传递,手工键入的String和转换为String的JSONObject,所有这些都给了我:

  

retrofit.RetrofitError:400 Bad Request

正在使用的网址是正确的,我已经与维护服务器并且它正在到达服务器的人进行了双重检查,但是使用了错误的"步骤"对象

我还尝试将其作为NameValuePair,Map和HashMap传递,所有这些都给了我:

  

retrofit.RetrofitError:零件主体不能为空。

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

如果Map类型已更改为我之前提到的所有类型。

2 个答案:

答案 0 :(得分: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对象属于com.google.gson包。在这里你需要做以下事情, JsonObject settingObject = new JsonObject(); settingObject.addProperty(&#34; type&#34;,&#34; begin&#34;); 在这种情况下,它将是,

    String updateUser(@Path(&#34; id&#34;)String userId,@ Part(&#34; step&#34;)JsonObject obj);

  2. 这就是你所需要的,顺便说一句,你也可以设置一次和所有的标题,为什么要在api上定义它呢?

答案 1 :(得分:0)

我仍然不明白这是什么问题,因为即使在尝试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);

据我所知,在改造的文档中没有提及,但确实有效。