Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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
Java Android多部分调用中的动态哈希数组及其改进_Java_Android_Retrofit_Okhttp_Multipart - Fatal编程技术网

Java Android多部分调用中的动态哈希数组及其改进

Java Android多部分调用中的动态哈希数组及其改进,java,android,retrofit,okhttp,multipart,Java,Android,Retrofit,Okhttp,Multipart,自从我上次在这里提问以来已经很久了 直截了当:需要使用改型在Android中发送一个动态字典数组,结构如下(足够简单): { “fields”: [ { “first: “a”, “last”: “b” }, { “first: “a”, “last”: “b” }, … ] } 如果这是一个@FormUrlEncoded带注释的调用,就可以了,问题是我还需要发送一个图像,所以它是一个@Multipart调用 我已在使用Request

自从我上次在这里提问以来已经很久了

直截了当:需要使用
改型
Android
中发送一个动态字典数组,结构如下(足够简单):

{
  “fields”: [
  {
    “first: “a”,
    “last”: “b”
  },
  {
    “first: “a”,
    “last”: “b”
  },
  …
  ]
}
如果这是一个
@FormUrlEncoded
带注释的调用,就可以了,问题是我还需要发送一个图像,所以它是一个
@Multipart
调用

我已在使用
RequestBody
@Multipart
调用中成功发送字符串参数,但所有尝试均失败

根据,改装增加了对iterable参数的支持,这就是实现这一点的方法

@Multipart
@POST("/foo/bar/")
Call<ResponseBody> method(@Part("ping") List<String> ping);
尝试发送
映射
列表,使用
RequestBody.create(param,MediaType.parse(“text/plain”))创建每个值
,但在服务器上得到一个空哈希值
{“interval”=>“{}

尝试了许多不同的方法,比如通过
MultipartBody.Builder
直接发送
RequestBody
,就像在某处看到的那样,但没有运气。我也“接近”了

这仍然很遥远。需要一个数组。在
iOS
中,使用
Alamofire
,我使用以下代码,它创建了预期的数组而不是字典。非常简单的东西

rootValue.forEach { element in
  for key in element.keys {
    if let value = element[key] as? String, let data = value.data(using: .utf8) {
      multipartFormData.append(data, withName: "\(rootKey)[][\(key)]")
    }
  }
}
尝试了许多变化,包括“官方”的一个和没有工作。我想我错过了一些东西,似乎不难做到,但我已经没有主意了

{"fields"=>"{\"first\":\"a\",\"last\":\"b\"}"}
Call<Object> sendStuff(@PartMap Map<String, RequestBody> params);
    
LinkedHashMap<String, RequestBody> mp = new LinkedHashMap<>();
for (int i = 0; i < fields(); i++) {
  ...
  mp.put("fields[" + i + "][first]", RequestBody.create(first, MediaType.parse("text/plain")));
  mp.put("fields[" + i + "][last]", RequestBody.create(last, MediaType.parse("text/plain")));
}
Call<?> call = getService(context).sendStuff(mp);
{"fields"=>{"0"=>{"first"=>"12:42", "last"=>"13:03"}, "1"=>{"first"=>"13:30", "last"=>"13:42"}}}
rootValue.forEach { element in
  for key in element.keys {
    if let value = element[key] as? String, let data = value.data(using: .utf8) {
      multipartFormData.append(data, withName: "\(rootKey)[][\(key)]")
    }
  }
}