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

我试图发出一个请求,其中包含一个 Header、一个表单 urlencode 字段和一个 json 主体。 我的改造接口如下所示

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

当我提出这个要求,我得到异常 @Body参数不能与形式或多部分编码使用。
我还尝试使用 @Multipart注释:

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

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

81289 次浏览

这篇文章为我指出了正确的方向。 我把身体里的所有东西连接起来,然后以 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")));

也许这可以帮助一些人,如果你有这个问题,你应该 Move@FormUrlEncode的你的接口。 希望这个能帮上忙。

我通过将字段添加到

@POST("/api/register")

像这样:

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

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

在 Kotlin 使用 json Body 发送身份验证头到 API 示例代码:

 @POST("/api/user/sendlist/")
fun callSendJsonListPost(
@Header("Authheader") header: String,
@Body list: StringBuilder
)
: Observable<EntityModelUserslist>

除了 Julien 的回答,还要删除 @Multipart注释:

@POST("/app/oauth/token")
Call<AuthResponse> getAuthToken(@Body RequestBody body);

下面是我构建 RequestBody的方法:

RequestBody requestBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("grant_type", "password")
.addFormDataPart("username", username)
.addFormDataPart("password", password)
.build();