Проблема с типом содержимого Retrofit-2

My Api принимает в качестве заголовков приложение Content-Type / json. Я установил заголовок идеально, как указано в документации по модернизации.

@Headers("Content-Type: application/json")
@POST("user/classes")
Call<playlist> addToPlaylist(@Body PlaylistParm parm);

Но в журнале запросов возвращается Content-Type txt / html. Итак, как мне исправить эту проблему? Этот api отлично работает в POSTMAN  введите описание изображения здесь

введите описание изображения здесь


person Muhammad Zubair Ashraf    schedule 02.03.2016    source источник
comment
Я не думаю, что это проблема дооснащения. Обычно веб-сайты возвращают результаты в формате txt / html. Вы должны запросить api с чем-то вроде ?format=json. Вы можете просто проверить это, открыв URL-адрес API прямо в браузере.   -  person Amit Tiwari    schedule 02.03.2016
comment
Пожалуйста, опубликуйте html-запрос и запрос почтальона.   -  person Christopher    schedule 02.03.2016
comment
@Christopher обновил вопрос запросом почтальона   -  person Muhammad Zubair Ashraf    schedule 02.03.2016
comment
Он возвращает код ошибки http 405: метод запрещен. Вы должны это изучить.   -  person Rohit5k2    schedule 02.03.2016
comment
Не могли бы вы просто добавить свои два HTTP-запроса? Один от переоборудования, другой от почтальона. Их должно быть легко сравнить ...   -  person Christopher    schedule 02.03.2016
comment
groopiesdev.com/api/v1/user/classes Авторизация Основная ZXlKbGVIQWlPakUwTlRjd01EVTVNRE1zSW1Gc1p5STZJa2hUTWpVMklpd2lhV0YwSWpveE5EVTJPVEU1 TlRBemZRLmV5SnBaQ0k2TnpKOS5wbExhZmNxVVBoVGZpV2prLXFDREQ2eXQwQ0tSdlc0R0c1eHJ2enRHN XBnOjE = Content-Type приложения / JSON {идентификатор пользователя: 72, ClassID: 38}   -  person Muhammad Zubair Ashraf    schedule 03.03.2016
comment
Ваш API показывает, что он разрешает только GET метод, пока вы используете POST. И это также отображается в сообщении об ошибке, которое вы получаете method not allowed. Итак, ваш API не настроен для почтового запроса.   -  person Darpan    schedule 22.06.2016
comment
есть какое-нибудь решение?   -  person Vikash Parajuli    schedule 30.01.2017
comment
Да, у меня есть решение. Я устанавливал заголовок в Retrofit.Builder. Я удалил этот заголовок из построителя и передал интерфейс, моя проблема была решена.   -  person Muhammad Zubair Ashraf    schedule 02.02.2017
comment
@Zubair, можешь показать мне свой рабочий код? На самом деле, у меня такая же проблема   -  person Ready Android    schedule 27.07.2017


Ответы (6)


Попробуйте этот тип заголовка для Retrofit 1.9 и 2.0. Для типа содержимого Json.

@Headers({"Accept: application/json"})
@POST("user/classes")
Call<playlist> addToPlaylist(@Body PlaylistParm parm);

Вы можете добавить еще много заголовков, т.е.

@Headers({
        "Accept: application/json",
        "User-Agent: Your-App-Name",
        "Cache-Control: max-age=640000"
    })

Динамически добавлять в заголовки:

@POST("user/classes")
Call<ResponseModel> addToPlaylist(@Header("Content-Type") String content_type, @Body RequestModel req);

Назовите вас методом, т.е.

mAPI.addToPlayList("application/json", playListParam);

Or

Хотите передавать каждый раз, тогда создайте объект HttpClient с http Interceptor:

OkHttpClient httpClient = new OkHttpClient();
        httpClient.networkInterceptors().add(new Interceptor() {
            @Override
            public com.squareup.okhttp.Response intercept(Chain chain) throws IOException {
                Request.Builder requestBuilder = chain.request().newBuilder();
                requestBuilder.header("Content-Type", "application/json");
                return chain.proceed(requestBuilder.build());
            }
        });

Затем добавьте к объекту модернизации

Retrofit retrofit = new Retrofit.Builder().baseUrl(BASE_URL).client(httpClient).build();

ОБНОВЛЕНИЕ, если вы используете Kotlin, удалите { }, иначе это не сработает.

person Avinash Verma    schedule 08.08.2017

вы можете попробовать одно из следующих моих решений:

@POST("user/classes")
Call<playlist> addToPlaylist(@Header("Content-Type") String content_type, @Body PlaylistParm parm);

тогда позвони

mAPI.addToPlayList("application/json", playListParam);

Или

Создать объект HttpClient

OkHttpClient httpClient = new OkHttpClient();
        httpClient.networkInterceptors().add(new Interceptor() {
            @Override
            public com.squareup.okhttp.Response intercept(Chain chain) throws IOException {
                Request.Builder requestBuilder = chain.request().newBuilder();
                requestBuilder.header("Content-Type", "application/json");
                return chain.proceed(requestBuilder.build());
            }
        });

Затем добавьте к объекту модернизации

Retrofit retrofit = new Retrofit.Builder().baseUrl(BASE_URL).client(httpClient).build();
person Thai Phan Dinh    schedule 03.03.2016
comment
Спасибо за ответ. Я пытался сделать запрос обоими способами, но у меня не получилось :( - person Muhammad Zubair Ashraf; 03.03.2016
comment
не могли бы вы предоставить мне данные для запроса, если вы не против - person Thai Phan Dinh; 03.03.2016
comment
groopiesdev.com/api/v1/user/classes авторизации Basic ZXlKbGVIQWlPakUwTlRjd01EVTVNRE1zSW1Gc1p5STZJa2hUTWpVMklpd2lhV0YwSWpveE5EVTJPVEU1TlRBemZRLmV5SnBaQ0k2TnpKOS5wbExhZmNxVVBoVGZpV2prLXFDREQ2eXQwQ0tSdlc0R0c1eHJ2enRHNXBnOjE = Содержание -Тип application / json {идентификатор пользователя: 72, идентификатор класса: 38} - person Muhammad Zubair Ashraf; 03.03.2016
comment
когда я пытаюсь использовать ваши данные почтальоном, я получаю ошибку: Ошибка: 500 Внутренняя ошибка сервера - person Thai Phan Dinh; 04.03.2016
comment
Проблема с Actullay в том, что мой запрос - POST. Но в журнале запросов он показывает GET Request..log .. я не знаю, как он автоматически конвертируется в GET - person Muhammad Zubair Ashraf; 07.03.2016
comment
Не могли бы вы поделиться, как вы делаете свой playListParam, который отправляется как тело? - person B.shruti; 18.05.2018

Вот решение, которое работает как retrofit2 (v2.5), так и okhttp3. Особенно хорошо работает, если вы добавите эти заголовки к ряду запросов.

OkHttpClient.Builder httpClientBuilder = new OkHttpClient.Builder();
        httpClientBuilder.addInterceptor(new Interceptor() {
            @Override
            public Response intercept(Chain chain) throws IOException {
                Request.Builder requestBuilder = chain.request().newBuilder();
                requestBuilder.header("Content-Type", "application/json");
                requestBuilder.header("Accept", "application/json");
                return chain.proceed(requestBuilder.build());
            }
        });

 OkHttpClient httpClient = httpClientBuilder.build();
 Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .client(httpClient)
                .build();
person Mitch M    schedule 31.01.2019

Пытаться:

@POST("user/classes")
Call<playlist> addToPlaylist(
@Header("Content-Type") String contentType,
@Body PlaylistParm parm);
person Anurag Chutani    schedule 03.03.2016

Дооснащение 2.0 сводило меня с ума. В конце концов я сдался и попробовал: Android Async Http

И это сработало с первого раза. Я знаю, о чем вы думаете, что я ищу stckovflw points или я как-то пламенею Retrofit. Я не. Мой вариант использования заключался в том, чтобы вызвать мою учетную запись bitbucket с простой встроенной аутентификацией: https://[имяпользователя]:[пароль]@api.bitbucket.org/2.0/repositories/[имяпользователя]

С Retrofit я получил еще один отклик. Http 200, но не та полезная нагрузка, которую я ожидал, как вы получили бы от Postman. Я перепробовал все, что мог, чтобы заставить его работать. Потрачено, думаю, 2 дня на это или больше. Думаю, вы могли подумать, что вы неправильно сформировали свой baseUrl ... или URI для ресурса. Посмотрите на приведенное выше, насколько это может быть проще ... Я попытался сократить URI до минимума. и установка базового URL на самую длинную часть из вышеперечисленного; Напоминание: получил обратно Http 200. Но не правильный ответ!

Мой коллега предложил использовать асинхронную библиотеку. и учитывая все рекомендации по модернизации и время, которое я потратил, я был настроен скептически. Это сработало с первого раза !!

person Beezer    schedule 26.06.2018
comment
Остерегаться. Async Http Loopj устаревает и не обслуживается. У меня было много ошибок с SSL и тайм-аутом, которые я не мог воспроизвести ни в одном другом http-клиенте. Последние несколько изменений кода были внесены в ноябре 2017 г. и апреле 2016 г., и проблемы накапливаются. - person Vitor Hugo Schwaab; 06.11.2018

возможно, вам понадобится '/', и лучше не менять Content-Type самостоятельно. именно так:

@POST("user/classes/")
Call<playlist> addToPlaylist(@Body PlaylistParm parm);
person Yongjian H    schedule 29.05.2016