在Retrofit中一起使用@Field和@Body参数

Ami*_*ari 6 android retrofit

我正在使用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);
Run Code Online (Sandbox Code Playgroud)

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

@Field parameters can only be used with form encoding.
Run Code Online (Sandbox Code Playgroud)

当我使用时@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);
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

@FormUrlEncoded or @Multipart can not be used with @Body parameter.
Run Code Online (Sandbox Code Playgroud)

我如何使其工作?

Ami*_*ari 5

最后,让它发挥作用.@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);
Run Code Online (Sandbox Code Playgroud)

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

Place place = ...
Gson gson = new GsonBuilder().disableHtmlEscaping().create();
String placeJSON = gson.toJson(place);
Run Code Online (Sandbox Code Playgroud)