如何使用Retrofit lib同时发送@FormUrlEncoded和@Multipart请求

时间:2015-10-28 16:38:07

标签: android post retrofit

我正在编写客户端 - 服务器Android应用程序。我需要通过POST请求将用户(照片)创建的文件发送到服务器。问题是,当我尝试发送文件时,我无法在我的请求中添加POST字段。也许我从根本上说错了,这个操作应该以另一种方式完成?

@FormUrlEncoded
@Multipart
@POST("/answer/add-file")
Call<AbstractServerResponse> sendSingleFile(@Query("access-token") String accessToken,
                                            @Query("w") String screenWidth,
                                            @Field("answer_id") Integer answerId,
                                            @Part("file") File fileToUpload);

当我尝试仅以多部分方式发送文件时,我得到一个例外:

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

据我所知,这是因为请求的正文(主要部分)是空的。

2 个答案:

答案 0 :(得分:0)

当方法中存在@Multipart时,使用多部分请求。使用@Part注释声明部件。 ------来自here

我在我的项目中使用@Multipart:

@POST("/{action}")//POST 多个文件
@Multipart
public void PostAPI(
    @Path(value = "action", encode = false) String action, 
    @Part("path") TypedFile[] typedFiles, 
    @PartMap Map<String, String> params, 
    Callback<APIResponse> callback);

也许你可以试试这个:

@Multipart
@POST("/answer/add-file")
Call<AbstractServerResponse> sendSingleFile(
    @Query("access-token") String accessToken,
    @Query("w") String screenWidth,
    @Part("answer_id") Integer answerId, 
    @Part("file") File fileToUpload);

答案 1 :(得分:0)

不能在单个方法上同时使用@FormUrlEncoded@Multipart HTTP 请求只能有一个 Content-Type,而这两个都是内容类型。