Android 侦听器中的响应正常,但onSuccess()方法中的响应为空

Android 侦听器中的响应正常,但onSuccess()方法中的响应为空,android,retrofit,Android,Retrofit,我正在通过改装拦截请求的响应,方式如下: OkHttpClient client = new OkHttpClient(); client.interceptors().add(new Interceptor() { @Override public com.squareup.okhttp.Response intercept(Chain chain) throws IOException { co

我正在通过改装拦截请求的响应,方式如下:

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”是一个类变量,一个字符串。如您所见,它已被注释

稍后,我会这样做:

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();
                }
我在接口中使用此方法调用url:

@FormUrlEncoded
@POST ("login")
Call<JSONObject> login(@Header("x-imei") String imei, @Field ("usuario")String usuario, @Field("password") String password);
@FormUrlEncoded
@发布(“登录”)
调用登录(@Header(“x-imei”)字符串imei、@Field(“usuario”)字符串usuario、@Field(“password”)字符串password);

新答案:

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

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

更新:

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;
我刚刚做了一个快速测试,我认为您应该能够声明
JsonObject
(这是
com.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;

但是我从响应中提取主体的那一行被注释了,所以我不需要创建新的主体。我的问题是,我在拦截器中的响应主体中完美地构建了JSON,但在onSuccess()方法中,我将其设置为空…哦,对不起,我误解了你的问题-我认为只要你不取消注释那一行,它就可以工作。你能告诉我你是如何安装改装的吗?谢谢你的帮助。问题是服务器的答案非常非常复杂,而且有很多字段没有使用。因此,我没有从答案的字段中创建bean,而是尝试简单地获取JSONObject,并自己解析它。要尝试删除转换线。。。