2016-07-21 5 views
3

Google 도서 API를 Retrofit과 함께 사용하려고하면 빈 결과가 반환됩니다.
개조에서 https://www.googleapis.com/books/v1/volumes?q=9781451648546google books api retrofit

내가 인터페이스가 :

는 URL입니다에서

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

을 내 webservice class 나는 다음과 같은 방법이 다음 activity class I에서

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

을 방법 :

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) { 

    } 
    }); 
} 

1,363,210 나는 자바 클래스 예약BookList 있습니다. ?
이름 = "android.permission.INTERNET은

mBooks가 null 값을 반환하고, 나는이 문제를 해결 수있는 방법 : 매니페스트 파일에서

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

나는

사용 - 권한 안드로이드 추가 고마워요.

편집 :shuvro 님의 답변 문제를 바로 잡는데 도움이되었습니다. 내 Book 클래스에 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; 
    } 
} 

감사 :

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를 만들어!

+0

onFailure 메소드를 확인하십시오. Throwable에서 문제가 발생한 것 같습니다. 예 : t.printStackTrace();를 추가하십시오. onFailure 메소드 본체로 가서 logcat을 확인하십시오. –

+0

답장을 보내 주셔서 감사합니다. 내 logcat에서 아무 것도 보지 않았습니다. 디버그 모드에서 mBooks 값이 null임을 알 수 있습니다. – itnoob

+0

이 방법으로 onFailure를 변경 했습니까? @Override public void onFailure ( 호출, Throwable t 호출) { t.printStackTrace(); } –

답변

2

gradle 파일에 2 가지 종속성을 추가하십시오.

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) { 

     } 
    }); 
+0

왜 투표가 끝났습니까? –

+0

질문과는 아무런 관련이 없습니다. – Divers

+0

답장을 보내 주셔서 감사합니다. 응답에서 ID 값을 가져 오는 것입니다. 자바 클래스에서 "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; 
... 
} 

를 추측 생각이있어 자신의 코드로 변경)

또한 인터넷 사용 권한을 추가했는지 확인하십시오. API를 성공적으로 호출하지 못할 이유가 없기 때문에 this을 팔로우 할 수 있습니다. 필드 이름도 정확하고 반환 된 JSON에 포함 된 것과 일치해야합니다.

+0

인터넷 사용 권한이 이미 추가되었으며 fieldname "id"및 "title" 클래스 도서는 일반적으로 json이 반환하는 필드 이름과 일치해야합니다 (제 생각에는),하지만 여전히 응답에 결과가 없습니다. – itnoob

1

BookList POJO 클래스는 JSON 응답과 아무 관련이 없습니다.

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

당신은 그 응답 here에 대한 모든 POJO 클래스를 찾을 수 있습니다 : 그런 일해야한다.