首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Retrofit将名称/值对作为多部分对象发送

使用Retrofit将名称/值对作为多部分对象发送
EN

Stack Overflow用户
提问于 2016-01-28 19:38:15
回答 2查看 1.3K关注 0票数 1

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

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

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

代码语言:javascript
复制
{"step":
    {"type":"begin"}
}

然而,事实证明,这是令人惊讶的困难。

我尝试过的东西包括将它作为一个MultipartTypedOutput、一个手工类型的字符串和一个转换为String的JSONObject传递,所有这些都给了我:

retrofit.RetrofitError: 400个坏请求

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

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

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

@FieldPart看起来很完美,因为它与多部分不兼容,那么是否有一种方法可以用于Retrofit呢?

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

代码语言:javascript
复制
@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类型已更改为我前面提到的所有类型。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-02 17:37:42

我仍然不明白问题是什么,因为即使在尝试Ankush提到的内容时,也发生了“部件不能为空”的情况。

无论是哪种方式,我都和几个朋友谈过话,后来又扩展了几个联系人,我得到了以下解决方案:

代码语言:javascript
复制
@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);

据我所能找到的,这一点并没有在任何地方提到改造的文件,但它是有效的。

票数 0
EN

Stack Overflow用户

发布于 2016-01-28 20:41:42

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

代码语言:javascript
复制
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将类似于

代码语言:javascript
复制
@Multipart
@PUT("/0.1/user/{id}")
String updateUser(@Path("id") String userId, @Part("step") Example exp);
  1. 或者,您可以使用JsonObject,这不是您已经使用过的Apache JSONObject。它是google对象,属于com.google.gson包。在这里您需要执行以下操作: JsonObject settingObject =新JsonObject();settingObject.addProperty("type","begin");在本例中,它将是, 字符串updateUser(@Path("id")字符串userId,@Part("step") JsonObject obj);

这就是您所需要的,顺便说一下,您也可以一次性设置头部,为什么还要在api上定义它呢?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35070492

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档