67

我正在尝试发出一个请求,其中我想包含一个 Header 、一个 form-urlencoded 字段和一个 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并且只允许一个编码注释。

4

5 回答 5

103

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

于 2016-04-19T08:26:56.710 回答
23

这篇文章为我指明了正确的方向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")));
于 2014-12-08T09:47:31.627 回答
5

添加到朱利安的答案中,还要删除@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();
于 2020-09-29T12:24:43.717 回答
1

我通过将字段添加到

@POST("/api/register") 

像这样:

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

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

于 2017-04-20T09:27:25.393 回答
0

将带有 json Body 的 Authentication 标头发送到 Kotlin 中的 API 示例代码:

 @POST("/api/user/sendlist/")
    fun callSendJsonListPost(
                      @Header("Authheader") header: String,
                      @Body list: StringBuilder
                      )
        : Observable<EntityModelUserslist>
于 2018-12-09T08:12:26.627 回答