在此处发布此问题之前,我尝试在接口方法上面添加@Multipart
并且在stackoverflow中搜索仍然找不到类似于我的问题。
在这种情况下,我尝试使用TypedFile
将图像发送到服务器。我的界面方法如下所示:
@Headers({"Content-type: application/json"})
@POST("/user/change")
void postChange(@Query("name") String name, @Query("email") String email, @Query("password") String password, @Query("phone") String phone, @Query("user_id") String userId, @Query("address[]") String[] listAddress, @Query("head[]") String[] head, @Part("photo_profile") TypedFile photoProfile, @Body TypedInput jsonObject, Callback<ReceiveDTO> callback);
修改
在该方法中,我们可以看到@Part
和@Body
。如果我在方法上方添加@Multipart
,我们会抛出错误@Body parameters cannot be used with form or multi-part encoding. (parameter #9)
我正在使用 Retrofit 1.9
答案 0 :(得分:11)
我们仅在Get
请求使用 @Query ,实际上 @Query 在网址末尾附加参数,请参阅Document示例。
如果您需要将用户个人资料发送到服务器,请使用MultiPart
:
多部件使用Retrofit的转换器之一或者他们可以实现 RequestBody处理自己的序列化。
例如,在下面的代码中,我们可以向服务器发送带有一些描述的个人资料照片:
@Multipart
@PUT("user/photo")
Call<User> updateUser(@Part("photo") RequestBody photo, @Part("description") RequestBody description);
您甚至可以使用@Part添加更多其他属性。请参阅完整示例here,其中逐步说明了如何执行此操作。
修改:正如JackWarthon解释here, @Body 注释定义了一个请求正文。
interface Foo {
@POST("/jayson")
FooResponse postJson(@Body FooRequest body);
}
答案 1 :(得分:6)
对于遇到相同问题的任何人,请确保在@ POST / @ PUT上方添加@Multipart批注。我遇到了同样的错误,而我的问题只是我缺少该注释