android-改装-@Body参数不能与表单或多部分编码一起使用

我正在尝试提出一个请求,其中要包含一个Header,一个表单编码的字段和一个json主体。我的改装界面如下

@FormUrlEncoded
@POST("/api/register")
Observable<RegisterResponse> register(
    @Header("Authorization") String authorization, 
    @Field("grant_type") String grantType, 
    @Body RegisterBody body
);

当我发出此请求时,我得到异常@Body的参数,不能与形式或多部分编码一起使用。
我也尝试使用IllegalArgumentException批注:

@Multipart
@FormUrlEncoded
@POST("/api/register")
Observable<RegisterResponse> register(
    @Header("Authorization") String authorization, 
    @Part("grant_type") TypedString grantType, 
    @Body RegisterBody body
);

我得到IllegalArgumentException,并且只允许一个编码注释。

Chris asked 2020-08-12T05:29:57Z
4个解决方案
72 votes

也许这可以对某些人有所帮助,如果遇到此问题,应删除界面的@FormUrlEncoded。希望这可以帮助。

Julien Athomas answered 2020-08-12T05:30:02Z
15 votes

这篇文章为我指明了正确的方向[https://stackoverflow.com/a/21423093/1446856。]我将身上的所有东西都贴上了,并以TypedInput的形式发送。
所以界面看起来像这样

@POST("/api/register")
@Headers({ "Content-Type: application/json;charset=UTF-8"})
Observable<RegisterResponse> register(
    @Header("Authorization") String authorization,
    @Body TypedInput body
);

身体看起来像这样

String bodyString = jsonBody + "?grant_type=" + 
    grantType + "&scope=" + scope;
TypedInput requestBody = new TypedByteArray(
    "application/json", bodyString.getBytes(Charset.forName("UTF-8")));
Chris answered 2020-08-12T05:30:31Z
1 votes

我通过将字段添加到

@POST("/api/register") 

像这样:

@POST("/api/register?grantType=value")

这不是一个好的解决方案,但可能会有用。

Matt.Young answered 2020-08-12T05:31:00Z
0 votes

将带有json正文的身份验证标头发送到Kotlin中的API示例代码:

 @POST("/api/user/sendlist/")
    fun callSendJsonListPost(
                      @Header("Authheader") header: String,
                      @Body list: StringBuilder
                      )
        : Observable<EntityModelUserslist>
Hamed Jaliliani answered 2020-08-12T05:31:20Z
translate from https://stackoverflow.com:/questions/27317096/retrofit-body-parameters-cannot-be-used-with-form-or-multi-part-encoding