2016-07-21 7 views
3

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

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

В Модернизированный У меня есть интерфейс:

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 I имеют метод:

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 Книга и 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; 
    } 
} 

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

использует-разрешение андроида: 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; 
    } 
} 

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

+0

Проверьте способ onFailure, в Throwable t, вероятно, описал вашу проблему. Например. добавьте t.printStackTrace(); на тело метода onFailure и проверьте свой логарифм. –

+0

спасибо за ответ, я ничего не вижу в своем логарифме, я вижу, что значение mBooks равно null в режиме отладки – itnoob

+0

Вы изменили свой onFailure таким образом? @Override public void onFailure (Call call, Throwable t) { t.printStackTrace(); } –

ответ

2

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

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

Создание класса, позволяет Сац 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) { 

     } 
    }); 
+0

, почему голосует? –

+0

Это не имеет никакого отношения к вопросу. – Divers

+0

Спасибо за ответ, это работает, чтобы получить значения ID из ответа, в моем классе java я также определил поле «title», но это поле остается пустым в моем ответе, любое предположение о том, как я могу получить значения заголовков? – itnoob

1

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

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; 
... 
} 

(от курса адаптируйте свой код)

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

+0

, спасибо, теперь было добавлено разрешение для Интернета, а полевое имя «id» и «title» from классная книга обычно должна совпадать с именем поля, которое json возвращает (я думаю), но оно все еще не дает результата в ответе – itnoob

1

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

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

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