【问题标题】:retrofit 2 post Multipart Json with name改造 2 发布带有名称的 Multipart Json
【发布时间】:2016-07-26 23:48:00
【问题描述】:

我正在尝试通过改造 2 发布,坐标,示例:

name="geo" {"date":"2016-03-28 18:15:22","lat":65.9667,"long":-18.5333}

你能帮帮我吗?我有, 型号:

public class LocationCoordinatesEntity{

@SerializedName("long")
@Expose
private Double longitude;

@SerializedName("lat")
@Expose
private Double latitude;

@SerializedName("date")
@Expose
private Date date;

public Double getLongitude() {
    return longitude;
}

public void setLongitude(Double longitude) {
    this.longitude = longitude;
}

public Double getLatitude() {
    return latitude;
}

public void setLatitude(Double latitude) {
    this.latitude = latitude;
}

public Date getDate() {
    return date;
}

public void setDate(Date date) {
    this.date = date;
}

public LocationCoordinatesEntity(Double longitude, Double latitude, Long date){
    this.latitude = latitude;
    this.longitude = longitude;
    this.date = new Date(date);
} }

@Multipart
@POST("setgeojson")
Observable<Void> setgeoMultipart(@Part("geo") String geo);

  Observable<Void> sendMultipartObservable = apiInterface.setgeoMultipart(gson.toJson(coordinatesEntity));

当我要发布这个时,我得到一个错误:

java.lang.IllegalStateException: JSON must start with an array or an object.

【问题讨论】:

  • 你为什么使用multipart 目的是什么?

标签: android json post multipart retrofit2


【解决方案1】:

您正在尝试发布一个字符串而不是 json 对象。

改变这个:

apiInterface.setgeoMultipart(coordinatesEntity);

然后改变这个:

@Multipart
@POST("setgeojson")
Observable<Void> setgeoMultipart(@Part("geo") LocationCoordinatesEntity geo);

【讨论】:

  • @Body 参数不能与表单或多部分编码一起使用。在这种情况下,我将只有没有键“geo”的 Json
  • 我的错,试试setgeoMultipart(@Part("geo") LocationCoordinatesEntity geo)
  • 谢谢,这行得通,但如果我需要以同样的方式发送坐标实体列表怎么办?
  • 我没试过,但你可以试试List&lt;LocationCoordinatesEntity&gt; geo 或类似的东西。
  • 这会将它们像一个独立的 Json 对象一样单独发布,但不像 JsonArray
【解决方案2】:

另一个技巧是这样做(这会将 2 个 JSON 对象合并为 1 个,当改造将执行 Http 发布时):

HashMap<String, Object> map = new HashMap<>();
map.put("obj1name", someObject1);
map.put("obj2name", someObject2);
somePostCall(map);

接口调用应该是这样的:

@POST("some/url/to/post")
Call<SomeType> somePostCall(
        @Body HashMap combinedObject
);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-13
    • 1970-01-01
    • 2016-03-23
    • 2016-12-17
    • 2016-08-22
    • 1970-01-01
    • 2018-05-28
    相关资源
    最近更新 更多