Подтвердить что ты не робот

Параметры Retrofit - @Body нельзя использовать с формой или многочастной кодировкой

Я пытаюсь сделать запрос, в который я хочу включить заголовок, поле формы и 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, и допускается только одна аннотация кодирования.

4b9b3361

Ответ 1

Этот пост указал мне в правильном направлении fooobar.com/questions/39626/.... Я прикрепил все в теле и отправлю его как 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

Возможно, это может помочь некоторым людям, если у вас есть эта проблема, вы должны удалить @FormUrlEncoded вашего интерфейса. Надеюсь, это поможет.

Ответ 3

Я решил эту проблему, добавив поле в

@POST("/api/register") 

вот так:

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

это нехорошее решение, но может быть полезно.

Ответ 4

Отправьте заголовок аутентификации с помощью json Body в пример кода API в Kotlin:

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