Параметры 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
, и допускается только одна аннотация кодирования.
Ответы
Ответ 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>