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,并自己解析它。要尝试删除转换线。。。