拦截器响应正常,但在onSuccess()方法

时间:2015-11-12 13:46:59

标签: android retrofit

我正在以这种方式拦截请求的响应,使用Retrofit:

OkHttpClient client = new OkHttpClient();
        client.interceptors().add(new Interceptor() {

            @Override
            public com.squareup.okhttp.Response intercept(Chain chain) throws IOException {
                com.squareup.okhttp.Response respuesta2 = chain.proceed(chain.request());
                //respuesta=respuesta2.body().string();
                return respuesta2;
            }
        });

“respuesta”是一个类变量,一个String。如你所见,它被评论。

后来,我这样做:

Call<JSONObject> peticion=interfaz.login(imei, user, encriptedPass);
        peticion.enqueue(new Callback<JSONObject>() {
            @Override
            public void onResponse(Response<JSONObject> response, Retrofit retrofit) {

                if(response.isSuccess()){
                    final AlertDialog.Builder builder=new AlertDialog.Builder(getActivity());
                    builder.setTitle(getString(R.string.welcome));
                    builder.setMessage(getString(R.string.loginok));
                    builder.setPositiveButton(getString(R.string.accept), new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            dialog.dismiss();
                            loginDialog.dismiss();
                        }
                    });
                    builder.create().show();
                    Log.i("David", "La respuesta: "+response.body().toString());

                }else{
                    try {
                        Log.i("David", "Error en la respuesta del login: " + response.errorBody().string());
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    final AlertDialog.Builder builder=new AlertDialog.Builder(getActivity());
                    builder.setTitle(getString(R.string.error));
                    builder.setMessage(getString(R.string.loginerror));
                    builder.setPositiveButton(getString(R.string.accept), new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            dialog.dismiss();
                            loginDialog.dismiss();
                        }
                    });
                    builder.create().show();
                }

这样,它进入onSuccess方法,但是response.body()到空。

如果我在Interceptor中取消注释上面的行(//respuesta = respuesta2.body()。string();),我在全局变量respuesta中完美地形成了JSON,键入String。但是执行将转到onFailure。我可以在那里管理JSON,因为它存储在类变量中,但它看起来不是正确的方法。

为什么我在onSuccess()中的响应是空的,但我在拦截器中有它?如何在onSuccess()中得到我的响应,应该是什么?

修改

根据要求,这就是我设置Retrofit的方法:

Retrofit builder = new Retrofit.Builder()
                .baseUrl(url)
                .addConverterFactory(GsonConverterFactory.create())
                .client(client)
                .build();

        final MyInterface interfaz = builder.create(MyInterface.class);

我在界面中使用此方法调用url:

@FormUrlEncoded
@POST ("login")
Call<JSONObject> login(@Header("x-imei") String imei, @Field ("usuario")String usuario, @Field("password") String password);

1 个答案:

答案 0 :(得分:1)

新答案:

由于您使用的是GsonConverterFactory,因此不应将JSONObject声明为返回类型,而应创建与JSON结构匹配的类,并让Gson将JSON字符串直接转换为该类。

Web上有很多教程,StackOverflow上有关于细节的问题,但如果您需要更多帮助,请随时询问。

<强>更新

我刚做了一个快速测试,我认为你应该能够声明JsonObjectcom.google.gson.JsonObject,而不是org.json.JSONObject)作为返回类型。这样,您就可以使用JSON结构中的键字符串在对象中导航。

旧答案,基于对问题的误解:

Response response = chain.proceed(request);

ResponseBody responseBody = response.body();
String responseBodyString = response.body().string();

// now we have extracted the response body but in the process have "consumed"
// the original response - it can be read only once. So, to return an intact
// response, we need to create a new one:

Response newResponse = response.newBuilder().body(ResponseBody.create(responseBody.contentType(), responseBodyString.getBytes())).build();

return newResponse;