Android 如何调试改装API调用?

Android 如何调试改装API调用?,android,json,rest,retrofit,retrofit2,Android,Json,Rest,Retrofit,Retrofit2,我正在使用改型从Flickr api获取一些数据。我正在进行调用的方法如下所示: 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());

我正在使用改型从Flickr api获取一些数据。我正在进行调用的方法如下所示:

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;
}
公共静态列表getImageID(int-size){
Call Call=flickrService.getPhotos(apiKey,格式为“1”);
Log.d(“临时标记”,“照片url:+call.request().url().toString());
photoIds=新的ArrayList();
call.enqueue(新回调(){
@凌驾
公共void onResponse(调用、响应){
Log.d(“临时标签”,“它来了”);
PhotosList PhotosList=response.body();
List photos=photosList.getPhotos().getPhoto();
(照片:照片){
Log.d(“TEMP_标记”,“将照片id添加到列表:”+photo.getId());
add(photo.getId());
}
}
@凌驾
失败时公共无效(调用调用,可丢弃的t){
//TODO:清理
Log.d(“临时标签”,“照片ID:”);
}
});
Log.d(“临时标签”,“它也到了”);
返回类光体;
}
但是,它永远不会进入
onResponse()
方法。
onResponse()
中的第一条日志语句永远不会打印,
onFailure()
中的日志语句也不会打印。当我尝试在浏览器中输入
call.request().URL().toString()
返回的URL时,它工作正常,并且我得到了预期的JSON。为什么我的
enqueue()
方法从未触发

谢谢你的帮助

与改装一起使用

如果这有帮助,请将其添加到build.gradle中-

//Retrofit and OkHttp for Networking
implementation 'com.squareup.retrofit2:retrofit:2.7.1'
implementation 'com.squareup.retrofit2:converter-gson:2.7.1'
//Logging Network Calls
implementation 'com.squareup.okhttp3:logging-interceptor:4.2.1'
APIClient类中添加此-

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代码

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)
    }
您将能够记录您所拨打的改装网络电话


如果您需要更多信息,请告诉我。

记录HTTP请求和响应数据的OkHttp拦截器

HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(Level.BASIC);
OkHttpClient client = new OkHttpClient.Builder()
    .addInterceptor(logging)
    .build();
您可以随时通过调用
setLevel
更改日志级别

有4个级别:无、基本、标题和正文

要登录到自定义位置,请将
记录器
实例传递给构造函数

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

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


编辑:我还发现它有一个非常好的结构和干净的日志。试试看

您可以使用以下类记录API调用

import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor

object HTTPLogger {
    fun getLogger(): OkHttpClient {
        /*
         * OKHTTP interceptor to log all API calls
         */
        val interceptor = HttpLoggingInterceptor()
        interceptor.level = HttpLoggingInterceptor.Level.BODY
        val client = OkHttpClient.Builder()
                .addInterceptor(interceptor)
                .build()
        return client
    }
}
然后,您可以像这样在改造实例类中调用这个类

import retrofit2.Retrofit
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory
import retrofit2.converter.gson.GsonConverterFactory

object RetrofitClientInstance {
    private var retrofit: Retrofit? = null
    val retrofitInstance: Retrofit?
        get() {
            if (retrofit == null) {
                retrofit = Retrofit.Builder()
                        .baseUrl(Constants.BASE_URL)
                        .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                        .addConverterFactory(GsonConverterFactory.create())
                        .client(HTTPLogger.getLogger())
                        .build()
            }
            return retrofit
        }
}
所需的依赖项是

implementation 'com.squareup.okhttp3:logging-interceptor:3.9.0'

嗯,这似乎对我没有任何帮助。使用上述代码并将
HttpLoggingInterceptor
放入进行调用的方法中,但没有得到任何输出。您是否使用此改型#客户端(客户端)添加了用于改型的客户端?是的,我将
.client(客户端)
添加到我构建改型对象的链中,因为OkHttp是按Builder模式设计的,因此,在调用之前,请小心地使用HttpLoggingInterceptor实现OkHttp。build()您可能希望添加初始化改造、Gson和任何适配器的代码。这不是一个真正的答案,但我个人的建议是,在测试新的网络调用时,始终使用类似Charles或Postman的代码。通过这种方式,您可以看到您发送的内容,以及您收到的原始格式的内容。此外,请删除日志
log.d(“TEMP_标记”,“照片url:”+call.request().url().toString())并查看它是否工作(call.request()元素可能在调用发生之前就已经使用了该调用),这只是日志记录。实际调试怎么样?有断点的?出于某种原因,获取响应主体的字段永远停留在“收集数据…”上。请参见此处:。怎么可能呢?我能做些什么使它有价值?