HTTP GET с телом запроса RETROFIT
Я использую Retrofit, чтобы совершать вызовы api в приложении для Android.
Я должен отправить @Body из JSON
@GET("api/")
void getData(@Body UserPostRequestBody request)
Я получаю сообщение об ошибке
retrofit.RetrofitError: apiCall: Non-body HTTP method cannot contain @Body or @TypedOutput.
Есть ли у вас идеи?
Ответы
Ответ 1
Чтобы отправить данные вместе с вашим Get Request
, вы можете сделать следующее:
//sending data as a url parameter
@GET("/group/{id}/users")
List<User> groupList(@Path("id") int groupId);
как сказано в этом SO ответ, семантика сервера для GET, однако, ограничена таким образом, что тело, если оно есть, не имеет семантического значения для запроса-Роя Филдинг.
Ответ 2
Определение GET, как описано здесь в этом ответе, объясняет, что тело не должно означать ничего, поэтому Retrofit не позволяет вам добавлять тело, Тем не менее, неверно, что сервер должен следовать этому формату. Для сервера вполне возможно, что конечная точка GET не только берет, но и ТРЕБУЕТ тело. Это была бы "плохая" архитектура, но для Retrofit кажется немного глупым, чтобы ограничить то, что библиотека может делать без необходимости.
Кроме того, различные методы HTTP имеют разные определения для того, что они ДОЛЖНЫ выполнять. Например, GET получает информацию, POST создает новую запись/объект, предоставляя информацию серверу, PUT обновляет существующую запись/объект и т.д. Проблема заключается в том, что самый простой способ передать сложные данные на сервер, особенно при использовании модифицировать, используя JSON. Таким образом, идеальным способом получения информации с сервера при предоставлении сложного фильтра было бы отправить тело JSON вместе с запросом GET. К сожалению, не существует метода HTTP-запроса, который допускает это по спецификации.
Ответ 3
Эта ошибка также возникает, когда API требует @POST и вы используете @GET
Ответ 4
Чтобы отправить данные запроса тела, используйте:
@HTTP (method = "DELETE", path = "/job/deletejob", hasBody = true) Наблюдаемый jobDelete (модель @Body JobDeleteRequestModel);
как описано в этом посте: метод @DELETE не поддерживается (HTTP-метод без тела не может содержать @Body или @TypedOutput.)