在我的代码中,我必须发出一个MultipartForm-Data PUT请求来更新服务器中的一个对象,它应该是多部分的,因为用户可以将图像与数据一起发送。
为了做到这一点,我目前正在使用Retrofit,因为它是我非常习惯的库,并且它正在向服务器发送图像。
但是,服务器端已经发生了变化,现在必须发送的参数之一是:
{"step":
{"type":"begin"}
}然而,事实证明,这是令人惊讶的困难。
我尝试过的东西包括将它作为一个MultipartTypedOutput、一个手工类型的字符串和一个转换为String的JSONObject传递,所有这些都给了我:
retrofit.RetrofitError: 400个坏请求
所使用的URL是正确的,我已经与维护服务器的人员进行了双重检查,并且它正在到达服务器,但是使用了一个不正确的"step“对象。
我还尝试将其传递为NameValuePair、Map和HashMap,所有这些都给了我:
retrofit.RetrofitError:部件主体不能为空。
@FieldPart看起来很完美,因为它与多部分不兼容,那么是否有一种方法可以用于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类型已更改为我前面提到的所有类型。
发布于 2016-02-02 17:37:42
我仍然不明白问题是什么,因为即使在尝试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);据我所能找到的,这一点并没有在任何地方提到改造的文件,但它是有效的。
发布于 2016-01-28 20:41:42
你实际上是用正确的方法做的,只是需要一些快速的修正。我有两个建议,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);com.google.gson包。在这里您需要执行以下操作: JsonObject settingObject =新JsonObject();settingObject.addProperty("type","begin");在本例中,它将是,
字符串updateUser(@Path("id")字符串userId,@Part("step") JsonObject obj);这就是您所需要的,顺便说一下,您也可以一次性设置头部,为什么还要在api上定义它呢?
https://stackoverflow.com/questions/35070492
复制相似问题