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

时间:2014-12-05 13:35:15

标签: android api retrofit square

我正在尝试发出一个请求,其中包含一个Header,一个form-urlencoded字段和一个json正文。 我的Retrofit界面如下

@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,只允许一个编码注释。

5 个答案:

答案 0 :(得分:62)

也许这可以帮助一些人,如果遇到这个问题,你应该删除界面的@FormUrlEncoded 。 希望这会有所帮助。

答案 1 :(得分:13)

这篇文章向我指出了正确的方向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")));

答案 2 :(得分:1)

我通过将字段添加到

来解决了这个问题
@POST("/api/register") 
像这样:

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

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

添加到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();