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

我试图做一个请求,其中我想包括一个头,一个表单urlencoded领域和一个JSON体。 我的改造界面如下

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

当我提出这个请求时,返回exception@Body参数不能用于表单或多部分编码。
我也尝试了@Multipart注解:

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

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

Solutions Collecting From Web of "改造 – @Body参数不能与表单或多部分编码一起使用"

也许这可以帮助一些人,如果你有这个麻烦,你应该删除@FormUrlEncoded你的接口。 希望这可以帮助。

这篇文章指出了我正确的方向https://stackoverflow.com/a/21423093/1446856 。 我把所有东西都附加在body中,并以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"))); 

我通过添加字段来解决这个问题

 @POST("/api/register") 

喜欢这个:

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

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