Обновление API Google Книг

Я пытаюсь использовать API книг Google с Retrofit, он возвращает пустой результат.

это URL:
https://www.googleapis.com/books/v1/volumes?q=9781451648546

В Retrofit у меня есть интерфейс:

public interface IServiceEndPoint {
  @GET("https://www.googleapis.com/books/v1/volumes?q=9781451648546")
  Call<BookList> getBooks();
}

в моем webservice class у меня есть следующий метод:

public void getBooks(final Callback<BookList> callback){
  IServiceEndPoint endPoint = mRetrofit.create(IServiceEndPoint.class);
  Call<BookList> call = endPoint.getBooks();
  call.enqueue(callback);
}

в activity class у меня есть метод:

private void getBooks(){
  WebserviceHelper.getmInstance().getBooks(new Callback<BookList>() {
    @Override
    public void onResponse(Call<BookList> call, Response<BookList> response) {
      mBooks = response.body().getResults();
      mBookAdapter.update(mBooks);
    }

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

    }
  });
}

У меня есть класс Java Book и BookList.

public class Book implements Serializable {

    @SerializedName("id")
    private String id;
    @SerializedName("title")
    private String title;
public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
}

public class BookList extends Book implements Serializable {
    @SerializedName("results")
    private List<Book> results;

    public List<Book> getResults() {
        return results;
    }

    public void setResults(List<Book> results) {
        this.results = results;
    }
}

В файле манифеста я добавил

использует-разрешение android:name="android.permission.INTERNET

mBooks возвращает нулевое значение, как мне решить эту проблему?
Спасибо.

EDIT: ответ shuvro помог мне решить проблему. Я также забыл включить VolumeInfo в свой класс Book. Мой книжный класс теперь выглядит следующим образом:

public class Book implements Serializable {

    @SerializedName("id")
    private String id;

    private VolumeInfo volumeInfo;

    public VolumeInfo getVolumeInfo() {
        return volumeInfo;
    }

    public void setVolumeInfo(VolumeInfo volumeInfo) {
        this.volumeInfo = volumeInfo;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

}

Дополнительно я создал класс volumeInfo:

public class VolumeInfo {
    private String title;
    private String subtitle;
    private String publisher;
    private String description;

    public String getSubtitle() {
        return subtitle;
    }

    public void setSubtitle(String subtitle) {
        this.subtitle = subtitle;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getPublisher() {
        return publisher;
    }

    public void setPublisher(String publisher) {
        this.publisher = publisher;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
}

Спасибо всем за помощь!


person itnoob    schedule 21.07.2016    source источник
comment
Проверьте свой метод onFailure, возможно, в Throwable описана ваша проблема. Например. добавить t.printStackTrace(); в тело метода onFailure и проверьте свой logcat.   -  person Honza Musil    schedule 21.07.2016
comment
спасибо за ответ, я ничего не просматриваю в своем логарифме, я вижу, что значение mBooks равно null в режиме отладки   -  person itnoob    schedule 21.07.2016
comment
Вы изменили свой onFailure таким образом? @Override public void onFailure(вызов Call‹BookList›, Throwable t) { t.printStackTrace(); }   -  person Honza Musil    schedule 21.07.2016
comment
да, я добавил это таким образом.   -  person itnoob    schedule 21.07.2016
comment
Можете ли вы опубликовать свой класс BookList?   -  person Honza Musil    schedule 21.07.2016
comment
Проверьте свой POJO, сделайте Book POJO и обертку со списком‹Книга›   -  person YakuZa    schedule 21.07.2016
comment
Я отредактировал свой вопрос и опубликовал класс Book и BookList.   -  person itnoob    schedule 21.07.2016


Ответы (3)


Добавьте две зависимости в свой файл gradle.

compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'

Создайте класс, давайте sats ServiceGenerator, ваш класс должен быть таким

public class ServiceGenerator {


    private static OkHttpClient.Builder httpClient = new OkHttpClient.Builder();

    private static Retrofit.Builder builder =
            new Retrofit.Builder()
                    .baseUrl("https://www.googleapis.com/books/v1/")
                    .addConverterFactory(GsonConverterFactory.create());

    public static <S> S createService(Class<S> serviceClass) {
        Retrofit retrofit = builder.client(httpClient.build()).build();
        return retrofit.create(serviceClass);
    }
}

Теперь вы объявляете свой интерфейс следующим образом

public interface IServiceEndPoint {
  @GET("volumes")
  Call<BookList> getBooks(@Query("q") String id);
}

Теперь в действии или во фрагменте используйте модификацию таким образом.

IServiceEndPoint serviceEndPoint = ServiceGenerator.createService(IServiceEndPoint.class)

Call<BookList> call = serviceEndPoint.getBooks("9781451648546");

 call.enqueue(new Callback<BookList>() {
        @Override
        public void onResponse(Call<BookList> call, Response<BookList> response) {
         //do whatever you want to do 
        }

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

        }
    });
person Mithun Sarker Shuvro    schedule 21.07.2016
comment
Это не имеет ничего общего с вопросом. - person Divers; 21.07.2016
comment
Спасибо за ответ, это работает, чтобы получить значения идентификатора из ответа, в моем классе Java я также определил заголовок поля, но это поле остается пустым в моем ответе, любое предложение о том, как я также могу получить значения заголовка? - person itnoob; 21.07.2016

Ваш BookList класс POJO не имеет ничего общего с ответом JSON. Это должно быть что-то вроде этого:

public class BookList { 
    @SerializedName("items")
    private List<Item> items = new ArrayList<Item>();
}

Вы можете найти все классы POJO для этого ответа здесь.

person Divers    schedule 21.07.2016

Я бы пошел по этому пути и просто следовал бы тому, как обычно делают с модернизацией.

public interface GBookService {

    @GET("volumes?q=9781451648546")
    Call<BookList> getBooks();

}

//

public class ApiHelper {

GBookService service;

  public ApiHelper(){
     Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("https://www.googleapis.com/books/v1/")
    .build();

    service = retrofit.create(GBookService.class);
  }

 public GBookService getService(){
     return service;
  }

}

и где вы хотите его использовать:

   Call<BookList> call = apiHelper.getService().getBooks();

    call.enqueue(new Callback<BookList>() {
        @Override
        public void onResponse(Call<BookList> call, Response<BookList> response) {

        }

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

        }
    });

И BookList, ты понял, я думаю

public class BookList {

String kind;
int totalItems;
List<Book> items;
...
}

(конечно, адаптируйте свой собственный код)

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

person agonist_    schedule 21.07.2016
comment
спасибо, разрешение на доступ в Интернет уже было добавлено, и идентификатор и заголовок имени поля из книги класса обычно должны совпадать с именем поля, которое возвращает json (я думаю), но это все равно не дает результата в ответ - person itnoob; 21.07.2016