Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/222.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用改型将名称/值对作为多部分中的对象发送_Android_Retrofit_Multipartform Data_Http Put - Fatal编程技术网

Android 使用改型将名称/值对作为多部分中的对象发送

Android 使用改型将名称/值对作为多部分中的对象发送,android,retrofit,multipartform-data,http-put,Android,Retrofit,Multipartform Data,Http Put,在我的代码中,我必须发出一个MultipartForm Data PUT请求来更新服务器中的一个对象,它应该是Multipart的,因为用户可能会将一个图像与数据一起发送 为了做到这一点,我目前正在使用改型,因为它是我非常熟悉的一个库,它正在向服务器发送图像 但是,服务器端的情况发生了变化,现在必须发送的参数之一是: {"step": {"type":"begin"} } 然而,事实证明,要做到这一点非常困难 我尝试过的方法包括将其作为MultipartTypedOutput传递、手动

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

为了做到这一点,我目前正在使用改型,因为它是我非常熟悉的一个库,它正在向服务器发送图像

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

{"step":
    {"type":"begin"}
}
然而,事实证明,要做到这一点非常困难

我尝试过的方法包括将其作为MultipartTypedOutput传递、手动键入字符串传递和将JSONObject转换为字符串传递,所有这些都让我:

改装。改装错误:400错误请求

所使用的URL是正确的,我已经与维护服务器的人员进行了双重检查,它正在到达服务器,但是使用了错误的“步骤”对象

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

改装。改装错误:零件主体不能为空

@FieldPart看起来非常适合这一点,但它与Multipart不兼容,所以有没有办法通过改装实现这一点

我目前的卖出方法如下:

@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);
@标题({
“连接:保持活动状态”,
“接受语言:en US”
})
@多部分
@PUT(“/0.1/user/{id}”)
字符串updateUser(@Path(“id”)字符串userId,@Part(“step”)映射类型);

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

您实际上是以正确的方式进行的,只需要一些快速修复。我有两个建议给你, 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);
  • 或者,您可以使用JsonObject,这不是您已经使用过的ApacheJSONObject。它是google gson对象,位于
    com.google.gson
    包下。在这里,您需要执行以下操作:, JsonObject settingObject=新建JsonObject(); settingObject.addProperty(“类型”、“开始”); 在这种情况下,

    字符串updateUser(@Path(“id”)字符串userId,@Part(“step”)JsonObject obj)


  • 这就是您所需要的,顺便说一句,您也可以一次性设置标题,为什么要费心在api上定义它?

    我仍然不明白问题是什么,因为即使尝试Ankush提到的内容,也会出现“Part body不得为null”的情况

    不管是哪种方式,我与一些朋友进行了交谈,后来进行了一些联系人扩展,我得到了以下解决方案:

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

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

    请添加您当前正在运行的代码以及HTTP请求的响应。抱歉,在重新编写问题几次后,忘记了重新添加实际代码。问题是被编辑来纠正的。@拉普拉斯如果下面的答案符合你的目的,考虑回答它并关闭它。我道歉这么长时间,项目的其他部分需要立即注意。事实证明,无论出于什么原因,这两种方法仍然给了我“PartBody不能为null”错误,但我确实设法用另一种方式解决了它。