【问题标题】:Use @Field and @Body parameters in Retrofit together在 Retrofit 中一起使用 @Field 和 @Body 参数
【发布时间】:2015-12-20 08:38:20
【问题描述】:

我正在使用 Retrofit 将一些数据发布到我的后端。我需要发送 3 个字符串和一个自定义 Place 对象。这是我正在做的事情:

@POST("/post/addphoto/")
    public void addImage(@Field("image_url") String url, @Field("caption") String caption, @Field("google_place_id") String placeId, @Body Place place, Callback<UploadCallBack> response);

有了这个,我收到了这个错误:

@Field parameters can only be used with form encoding.

当我使用@FormUrlEncoded 时,像这样:

@FormUrlEncoded
@POST("/post/addphoto/")
        public void addImage(@Field("image_url") String url, @Field("caption") String caption, @Field("google_place_id") String placeId, @Body Place place, Callback<UploadCallBack> response);

我收到此错误:

@FormUrlEncoded or @Multipart can not be used with @Body parameter.

如何让它发挥作用?

【问题讨论】:

  • Tiwari,请问您是否希望将 image_url 附加到 /post/addphoto url?
  • @cgr 不,我不想附加它。实际上,image_url 是来自 facebook 的图像的 url,我想将其与其他一些字段一起存储在后端。 Place 对象是我从 facebook 中提取的与该图像相关联的位置。
  • 据我所知,您需要将这种情况视为您在请求中只有一个位置来保存数据,它将是 RAW (body) 或 Form-shaped (FormUrlEncoded +Part) 所以这里就像你试图在一个地方混合 2 个数据结构,这是无法完成的
  • 您的后端需要什么数据格式? FormUrlEnceode 应仅用于表单类型。您的后端需要表单数据?

标签: android retrofit


【解决方案1】:

最后,让它工作。 @Body 和@Field 不能一起使用。如果使用@Body,它应该是唯一的参数,它不能与@FormUrlEncode 或@MultiPart 组合。于是放弃了这个想法。另一种选择是仅使用 @Field 并将 Place 对象作为 JSON 字符串发送。

这是我为 API 接口所做的:

@POST("/post/addphoto/")
    public void addImage(@Field("image_url") String url, @Field("caption") String caption, @Field("google_place_id") String placeId, @Field("facebook_place") String place, Callback<UploadCallBack> response);

这就是我为facebook_place 字段创建要发送的值的方式:

Place place = ...
Gson gson = new GsonBuilder().disableHtmlEscaping().create();
String placeJSON = gson.toJson(place);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-08
    • 2016-08-26
    • 2015-02-03
    • 2015-01-14
    • 2021-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多