如何捕获对get方法android改造的响应?

时间:2018-11-23 09:55:24

标签: android get retrofit

我是android开发的新手,正在尝试学习它。我最近遇到一个问题,当我使用get方法时,得到如下响应:

Image

由于后端有一个状态,该状态为“ 0”,因此无法捕获“ response_data ”数组。 任何人都可以指导我如何获得答复。 谢谢。

API客户端:

 public class ApiClient {
    private final static String BASE_URL = "http://api.xxxxxx.com/app/";
    public static ApiClient apiClient;
    private Retrofit retrofit = null;

    public static ApiClient getInstance() {
        if (apiClient == null) {
            apiClient = new ApiClient();
        }
        return apiClient;
    }
 public Retrofit getClient() {
        return getClient(null);
    }



    private Retrofit getClient(final Context context) {

        HttpLoggingInterceptor interceptor = new 
HttpLoggingInterceptor();
        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        OkHttpClient.Builder client = new OkHttpClient.Builder();
        client.readTimeout(60, TimeUnit.SECONDS);
        client.writeTimeout(60, TimeUnit.SECONDS);
        client.connectTimeout(60, TimeUnit.SECONDS);
        client.addInterceptor(interceptor);
        client.addInterceptor(new Interceptor() {
            @Override
            public okhttp3.Response intercept(Chain chain) throws 
IOException {
                Request request = chain.request();

                return chain.proceed(request);
            }
        });

        retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .client(client.build())
                .addConverterFactory(GsonConverterFactory.create())
                .build();


        return retrofit;
    }

    }

主要活动:

public class MainActivity extends AppCompatActivity {

TextView tvResponse;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    tvResponse=findViewById(R.id.tvResponse);

    ApiInterface apiInterface = ApiClient.getInstance().getClient().create(ApiInterface.class);
    Call<ResponseData> responseDataCall=apiInterface.getData();
    responseDataCall.enqueue(new Callback<ResponseData>() {
        @Override
        public void onResponse(Call<ResponseData> call, Response<ResponseData> response) {
            if (response.isSuccessful() && response.body()!=null && response!=null){
                List<ResponseDataItem> data=response.body().getResponseData();

            }
        }

        @Override
        public void onFailure(Call<ResponseData> call, Throwable t) {
            t.printStackTrace();
        }
    });
}

}

响应数据:

public class ResponseData {
@SerializedName("response_data")
private List<ResponseDataItem> responseData;

@SerializedName("status")
private int status;

public void setResponseData(List<ResponseDataItem> responseData){
    this.responseData = responseData;
}

public List<ResponseDataItem> getResponseData(){
    return responseData;
}

public void setStatus(int status){
    this.status = status;
}

public int getStatus(){
    return status;
}

}

3 个答案:

答案 0 :(得分:0)

对于捕获响应,您可以像interceptorHttpLoggingInterceptorstetho一样使用chuck

创建Retrofit实例

//将拦截器添加到OkHttpClient

  OkHttpClient client=new OkHttpClient().newBuilder()
        .addNetworkInterceptor(new StethoInterceptor()) \\ StethoInterceptor
        .addInterceptor(new ChuckInterceptor(context))  \\  ChuckInterceptor
        .connectTimeout(30, TimeUnit.SECONDS)
        .readTimeout(5, TimeUnit.MINUTES)
        .writeTimeout(5, TimeUnit.MINUTES)
        .build();

public static final String BASE_URL = "http://api.myservice.com/";
Retrofit retrofit = new Retrofit.Builder()
  .baseUrl(BASE_URL)
  .addConverterFactory(GsonConverterFactory.create())
  .client(client)
  .build();

用于Stetho拦截器

 implementation 'com.facebook.stetho:stetho:1.5.0'
 implementation 'com.facebook.stetho:stetho-okhttp3:1.5.0'

卡盘

 debugImplementation 'com.readystatesoftware.chuck:library:1.1.0'
 releaseImplementation 'com.readystatesoftware.chuck:library-no-op:1.1.0'

答案 1 :(得分:0)

创建界面

public interface ApiInterface {

    @GET
    Call<JsonElement> getTimeDifference(@Url String url);
}

为翻新客户做广告

public class RetrofitClient {

    private static final String TAG = "RetrofitClient";

    public static Retrofit geBaseUrl() {
        Retrofit retrofit = null;
        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
        if (BuildConfig.DEBUG) {
            interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        }else{
            interceptor.setLevel(HttpLoggingInterceptor.Level.NONE);
        }         OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build();

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


}

            String endpoint = "...your end point...";

            ApiInterface ret = RetrofitClient.geBaseUrl(url).create(ApiInterface.class);
            Call<JsonElement> call = ret.getTimeDifference(endpoint);
            call.enqueue(new Callback<JsonElement>() {
                @Override
                public void onResponse(Call<JsonElement> call, Response<JsonElement> response) {
                    try {
                        Log.d("String", "onResponse:  response" + response.body().toString());

                    } catch (Exception e) {
                       
                    }
                }

                @Override
                public void onFailure(Call<JsonElement> call, Throwable t) {
                    Log.d("response", "onFailure: " + t + "      " + call);
                    
                }
            });

答案 2 :(得分:0)

在这种情况下,您需要让Gson知道您想如何解析json。 您可以为每种特定的类情况添加许多特定的TypeAdapter,也可以创建一个TypeAdapterFactory来解析所有json。请记住将其添加到“改装”构建器中。

此代码示例是TypeAdapterFactory,它将忽略status并仅将response_data解析为对象。

class ResponseDataTypeAdapterFactory implements TypeAdapterFactory {

    public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
        TypeAdapter<T> delegate = gson.getDelegateAdapter(this, type);
        TypeAdapter<JsonElement> elementTypeAdapter = gson.getAdapter(JsonElement.class);

        return new TypeAdapter<T>() {
            public void write(JsonWriter out, T value) throws IOException {
                delegate.write(out, value);
            }

            public T read(JsonReader reader) throws IOException {

                JsonElement jsonElement = elementTypeAdapter.read(reader);

                if (jsonElement.isJsonObject()) {
                    JsonObject jsonObject = jsonElement.getAsJsonObject();
                    if (jsonObject.has("response_data")) {
                       jsonElement = jsonObject.get("response_data");
                    }
                }

                return delegate.fromJsonTree(jsonElement);
            }
        };
    }
}

在您的改造制造商上

Gson gson = new GsonBuilder()
    .registerTypeAdapterFactory(ResponseDataTypeAdapterFactory())
    .create();

new Retrofit.Builder()
    .baseUrl(BASE_URL)
    .client(client.build())
    .addConverterFactory(new GsonConverterFactory.create(gson))
    .build();

在Retrofit界面上,您只需调用与response_data映射相对应的类。

public interface ApiInterface {

    @GET("/product-data")
    Call<List<ResponseDataItem>> fetchData();
}

通过此实现,您可以删除ResponseData类,而只关心重要的模型。