我正在以这种方式拦截请求的响应,使用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);
答案 0 :(得分:1)
新答案:
由于您使用的是GsonConverterFactory
,因此不应将JSONObject
声明为返回类型,而应创建与JSON结构匹配的类,并让Gson将JSON字符串直接转换为该类。
Web上有很多教程,StackOverflow上有关于细节的问题,但如果您需要更多帮助,请随时询问。
<强>更新强>
我刚做了一个快速测试,我认为你应该能够声明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;