Response.isSuccessfull () является ложным - PullRequest
0 голосов
/ 20 февраля 2020

Помоги мне. Я использую модификацию для своего проекта, и я совершенно новичок в этом. Я получаю следующую ошибку. Почему я получаю ложный ответ?

2020-02-20 15:35:26.230 22602-22602/q.goaldiggers.auth_api_testing 
D/Ayush: Response
2020-02-20 15:35:26.230 22602-22602/q.goaldiggers.auth_api_testing 
D/Ayush: 
Response{protocol=http/1.1, code=402, message=Payment Required, 
url=https://quizziyapa.herokuapp.com/getTopics}
2020-02-20 15:35:26.230 22602-22602/q.goaldiggers.auth_api_testing 
D/Ayush: Payment Required
2020-02-20 15:35:26.230 22602-22602/q.goaldiggers.auth_api_testing 
D/Ayush: okhttp3.ResponseBody$1@647c751
2020-02-20 15:35:26.230 22602-22602/q.goaldiggers.auth_api_testing 
D/Ayush: null
2020-02-20 15:35:26.230 22602-22602/q.goaldiggers.auth_api_testing 
D/Ayush: false
2020-02-20 15:35:26.230 22602-22602/q.goaldiggers.auth_api_testing 
D/Ayush: retrofit2.OkHttpCall$NoContentResponseBody@4f0bbb6
[Error][1]

JSON Структура

Это моя json структура.

{
    "topics": [
        {
            "_id": 2,
            "topic": "abc",
            "imageUrl": "abc12345"
        },
        {
            "_id": 3,
            "topic": "abc",
            "imageUrl": "abc12345"
        }
    ]
}

Topi c. java

Класс моей модели

public class Topic {
    int _id;
    String topic;
    String imageUrl;

    public Topic(int _id, String topic, String imageUrl) {
        this._id = _id;
        this.topic = topic;
        this.imageUrl = imageUrl;
    }

    public int getId() {
        return _id;
    }

    public String getTopic() {
        return topic;
    }

    public String getImageUrl() {
        return imageUrl;
    }
}

TopicResponse. java

JSON класс ответа

public class TopicResponse {
    @SerializedName("topics")
    Topic[] topics;

    public TopicResponse(Topic[] topics) {
        this.topics = topics;
    }

    public Topic[] getTopics() {
        return topics;
    }
}

IUserApi. java (интерфейс API)

public interface IUserApi {
    @GET("getTopics")
    Call<TopicResponse> getTop();
}

MainActivity. java

Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("https://quizziyapa.herokuapp.com/")
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        IUserApi api =  retrofit.create(IUserApi.class);
        Call<TopicResponse> call= api.getTop();
        call.enqueue(new Callback<TopicResponse>() {
            @Override
            public void onResponse(Call<TopicResponse> call, Response<TopicResponse> response) {
                Log.d("Ayush", "Response");
                Log.d("Ayush", String.valueOf(response));
                Log.d("Ayush", String.valueOf(response.message()));
                Log.d("Ayush", String.valueOf(response.errorBody()));
                Log.d("Ayush", String.valueOf(response.body()));
                Log.d("Ayush", String.valueOf(response.isSuccessful()));
                Log.d("Ayush", String.valueOf(response.raw().body()));
            }

            @Override
            public void onFailure(Call<TopicResponse> call, Throwable t) {
                Log.d("Ayush", "Failed \n"+t.getMessage());
            }
        });

Помогите мне, что я должен сделать, чтобы решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 20 февраля 2020

Я думаю, что нашел решение. Этот API отлично работает на browser и Postman. Но если вы заметите на PostMan, статус будет 402Screenshot Postman Response

Согласно MDN Web Docs

Требуемый платеж HTTP 402 - это нестандартный код ответа о состоянии ошибки клиента, зарезервированный для будущего использования.

Поскольку retrofit следует за кодом состояния 200 в случае успеха, тело ответа в вашем случае: null.

Однако, если вы внимательно посмотрите на консоль отладки, значение (json) присутствует, но в errorBody.

Debug Screenshot

Я не уверен, почему Heroku отправляет запрос 402, но, согласно ответу ljk, кажется, что ваша учетная запись не полностью активирована.

Вы можете далее считывать Класс модернизации Ответ ,

Возвращает true, если код () находится в диапазоне [200..300).

0 голосов
/ 20 февраля 2020

Ну, судя по всему, проблема не в коде. Ответ, который вы получаете, не является сообщением об успешном завершении, а 402 errorCode с сообщением «Платеж требуется».

Причина этого согласно официальным документам используемого вами API. говорит

либо учетная запись стала просроченной в результате неоплаты, либо необходимо подтвердить способ оплаты учетной записи для продолжения

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

official docs for status codes returned.

Таким образом, сервер возвращает код ошибки. и ваш response.isSuccessful в конечном итоге будет ложным, если вы не получите в ответ сообщение об успешном завершении, то есть один из состояний, показанных на изображении.

Дайте мне знать, если это помогло.

...