2017-08-12 18 views
10

Tôi đang sử dụng trang bị thêm để lấy một số dữ liệu từ api Flickr. Phương pháp tôi thực hiện cuộc gọi trông giống như sau:Tôi làm cách nào để gỡ lỗi cuộc gọi API trang bị thêm?

public static List<String> getImageIds(int size) { 
    Call<PhotosList> call = flickrService.getPhotos(apiKey, format, "1"); 
    Log.d("TEMP_TAG", "photo url: " + call.request().url().toString()); 
    photoIds = new ArrayList<String>(); 

    call.enqueue(new Callback<PhotosList>(){ 
     @Override 
     public void onResponse(Call<PhotosList> call, Response<PhotosList> response) { 
      Log.d("TEMP_TAG", "it's getting here"); 
      PhotosList photosList = response.body(); 
      List<Photo> photos = photosList.getPhotos().getPhoto(); 

      for(Photo photo : photos) { 
       Log.d("TEMP_TAG", "adding photo id to list: " + photo.getId()); 
       photoIds.add(photo.getId()); 
      } 
     } 

     @Override 
     public void onFailure(Call<PhotosList> call, Throwable t) { 
      // TODO: Clean up 
      Log.d("TEMP_TAG", "photoId: "); 
     } 
    }); 
    Log.d("TEMP_TAG", "it's getting here too"); 
    return photoIds; 
} 

Tuy nhiên, nó không bao giờ đi vào phương thức onResponse(). Câu lệnh nhật ký đầu tiên trong phạm vi onResponse() không bao giờ in, cũng không có câu lệnh nhật ký trong onFailure(). Khi tôi thử nhập URL được trả về bởi call.request().url().toString() trong trình duyệt, nó hoạt động tốt và tôi nhận được JSON mong đợi. Tại sao phương pháp enqueue() của tôi không bao giờ được kích hoạt?

Cảm ơn bạn đã trợ giúp!

+1

này isnt một câu trả lời thật, nhưng đề nghị cá nhân của tôi là luôn luôn sử dụng một cái gì đó giống như Charles hoặc Postman khi kiểm tra các cuộc gọi mạng mới. Bằng cách đó bạn có thể thấy những gì bạn gửi và những gì bạn nhận được ở định dạng ban đầu của họ. – TooManyEduardos

+0

Ngoài ra, hãy xóa nhật ký 'Log.d (" TEMP_TAG "," url ảnh: "+ call.request(). Url(). ToString());' và xem nó có hoạt động hay không (phần tử call.request() có thể tiêu thụ cuộc gọi trước khi nó xảy ra) – TooManyEduardos

Trả lời

13

Sử dụng HttpLoggingInterceptor cùng với trang bị thêm.

Nếu đây giúp, thêm này bên build.gradle của bạn -

//Retrofit and OkHttp for Networking 
compile 'com.squareup.retrofit2:retrofit:2.3.0' 
compile 'com.squareup.retrofit2:converter-gson:2.3.0' 
//Logging Network Calls 
compile 'com.squareup.okhttp3:logging-interceptor:3.6.0' 

Bên trong bạn APIClient class thêm này -

public class ApiClient { 
    private static Retrofit retrofit = null; 

    public static Retrofit getClient(){ 

     HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); 
     interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); 
     OkHttpClient client = new OkHttpClient.Builder() 
       .addInterceptor(interceptor) 
       .build(); 


     if(retrofit==null){ 
      retrofit = new Retrofit.Builder() 
        .baseUrl(BuildConfig.baseUrl) 
        .addConverterFactory(GsonConverterFactory.create()) 
        .client(client) 
        .build(); 
     } 
     return retrofit; 
    } 
} 

Kotlin Mã

val interceptor : HttpLoggingInterceptor = HttpLoggingInterceptor().apply { 
      this.level = HttpLoggingInterceptor.Level.BODY 
     } 

val client : OkHttpClient = OkHttpClient.Builder().apply { 
      this.addInterceptor(interceptor) 
     }.build() 


fun getService(): Service { 
     return Retrofit.Builder() 
       .baseUrl(BASE_URL) 
       .addConverterFactory(GsonConverterFactory.create()) 
       .addCallAdapterFactory(LiveDataCallAdapterFactory()) 
       .client(client) 
       .build() 
       .create(Service::class.java) 
    } 

Và bạn sẽ có thể đăng nhập cuộc gọi Mạng Retrofit s mà bạn thực hiện.

Hãy cho tôi biết nếu bạn cần thêm thông tin.

8

Máy đánh chặn OkHttp ghi nhật ký yêu cầu HTTP và dữ liệu phản hồi.

HttpLoggingInterceptor logging = new HttpLoggingInterceptor(); 
logging.setLevel(Level.BASIC); 
OkHttpClient client = new OkHttpClient.Builder() 
    .addInterceptor(logging) 
    .build(); 

Bạn có thể thay đổi cấp nhật ký bất kỳ lúc nào bằng cách gọi setLevel.

Có 4 cấp độ: NONE, BASIC, tiêu đề, BODY

Để đăng nhập vào một vị trí tùy chỉnh, thông qua một ví dụ Logger để các nhà xây dựng.

HttpLoggingInterceptor logging = new HttpLoggingInterceptor(new 
Logger() { 
@Override public void log(String message) { 
    Log.d(TAG, "message: "); 
    } 
}); 

Từ Gradle

compile 'com.squareup.okhttp3:logging-interceptor:(insert latest version)' 

Follow này reference

+0

Hmm, điều này dường như không làm gì cho tôi. Sử dụng mã trên và đặt 'HttpLoggingInterceptor' vào phương thức thực hiện cuộc gọi, nhưng không có kết quả nào được đưa ra. – intA

+0

Bạn đã thêm khách hàng để trang bị thêm bằng cách sử dụng Retrofit # client (máy khách) này chưa? –

+0

Có, tôi đã thêm '.client (client)' vào chuỗi nơi tôi đang xây dựng đối tượng Retrofit của mình – intA

Các vấn đề liên quan