API всегда возвращает onFail при получении списка элементов

#android

#Android

Вопрос:

Я хочу получить все элементы объекта из API и поместить их в ListView, но, похоже, я не могу заставить это работать. Он всегда возвращает «Ошибка получения данных».

Вот мой API, к которому я обращаюсь.

Число в конце — это «идентификатор квартиры», который содержит связанную комнату, и в зависимости от идентификатора, он покажет список комнат.

Пример реализации:

 private void initView() {
        RoomRepository roomRepository = new RoomRepository();

        Intent intent = getIntent();
        final String apartmentId = "rooms?apartmentId="   intent.getStringExtra(MainActivity.APARTMENTID);

        roomRepository.getRoom(this, apartmentId, new CallBackData<List<Room>>() {
            @Override
            public void onSuccess(List<Room> rooms) {
                Toast.makeText(RoomListActivity.this, "Get data successful", Toast.LENGTH_SHORT).show();
                if (rooms.size() == 0)
                    Toast.makeText(RoomListActivity.this, "No Room found!", Toast.LENGTH_SHORT).show();
                else
                    buildLayout(rooms);
            }

            @Override
            public void onFail(String msg) {
                Toast.makeText(RoomListActivity.this, "Get data Failed ", Toast.LENGTH_SHORT).show();
            }
        });
    }
  

Мой класс репозитория-

 public void getRoom(Context context, String apartmentId, final CallBackData<List<Room>> callBackData){
        clientAPI clientApi = new clientAPI();
        Call<ResponseBody> serviceCall = clientApi.roomSerivce().getRoom(apartmentId);
        serviceCall.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                if (response != null amp;amp; response.body() != null) {
                    if (response.code() == 200) {
                        try {
                            String result = response.body().string();
                            Type type = new TypeToken<List<Room>>() {
                            }.getType();
                            List<Room> roomList = new Gson().fromJson(result, type);
                            if (roomList != null) {
                                callBackData.onSuccess(roomList);
                            } else {
                                callBackData.onFail("No data");
                            }
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                } else {
                    callBackData.onFail("No data");
                }
            }

            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {

            }
        });
    }
  

Конфигурация API

 public RoomSerivce roomSerivce(){
        return this.getService(RoomSerivce.class, configAPI.BASE_URL);
    }

public static final String BASE_URL = "http://apartmentpp.azurewebsites.net/";

public static final String GET_APARTMENT_ROOM = "hoangapi/";

public interface RoomSerivce {
    @GET(configAPI.GET_APARTMENT_ROOM   "/{apartmentId}")
    Call<ResponseBody> getRoom(@Path("apartmentId") String apartmentId);
}

  

Комментарии:

1. вы используете http вместо https , поэтому высока вероятность того, что сервер не получит ответа из-за конфигурации сетевой безопасности в последнем обновлении для системы безопасности .. проверьте отладку logcat и посмотрите, есть ли какое-либо сообщение, связанное с сетевой безопасностью

Ответ №1:

У вас есть дополнительный ‘/’ в вашем URL, что делает его неправильным. Посмотрите на приведенные ниже строки кода:

public static final String GET_APARTMENT_ROOM = "hoangapi/";

В конце у него есть ‘/’.

@GET(configAPI.GET_APARTMENT_ROOM "/{apartmentId}")

В начале у него есть ‘/’.

Когда вы их объединяете, это создает hoangapi//room?apartmentId= .

Двойная косая черта является реальной причиной. Удалите тот, который находится перед apartmentId, и все готово.

Ответ №2:

Изолируя ошибку, вы можете видеть, что это происходит между приложением и сервером или после того, как сервер ответил.

Итак, вам нужно отладить код и определить, где вызывается onFail(). If вызывается, когда ответ равен нулю, вам необходимо проверить соединение между приложением и сервером. Если происходит преобразование списка, вам нужно пересмотреть свой домен и сравнить с сервером json.

Ответ №3:

попробуйте это

 public interface RoomSerivce {
    @GET("hoangapi/rooms")
    Call<ResponseBody> getRoom(@Query("apartmentId") String apartmentId);
}