在 Retrofit2 中接收响应主体但未调用 onResponse
Receiving response body in Retrofit2 but onResponse is not getting called
我正在从我的 API 电话中收到一个正文,但是 onResponse()
没有被调用,方法如下:
final Rest_manager_league rest = new Rest_manager_league();
Call<List<Root>> listCall = rest.getMLeague_conn().getLeague(x);
listCall.enqueue(new Callback<List<Root>>() {
@Override
public void onResponse(Call<List<Root>> call, Response<List<Root>> response) {
lg = response.body();
Log.d("res", "ON");
if (response.isSuccessful()){
textView.setText(lg.get(3).getStanding().get(2).getTeamName());
Log.d("s", "true");
}
}
@Override
public void onFailure(Call<List<Root>> call, Throwable t) {
Log.d("Failure", "Failed");
}
});
这是 Retrofit 界面和服务:
public interface league_Conn {
@GET("/v1/soccerseasons/{id}/leagueTable")
@Headers("X-Auth-Token:" +
"1869f69f772b40a2a12fd6eefb4e48ef ")
Call<List<Root>> getLeague(@Path("id") int id);
}
public class Rest_manager_league {
private league_Conn mleague_conn;
public league_Conn getMLeague_conn() {
if (mleague_conn == null) {
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client = new OkHttpClient.Builder().addInterceptor(logging).build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://api.football-data.org/")
.addConverterFactory(GsonConverterFactory.create())
.client(client)
.build();
mleague_conn = retrofit.create(league_Conn.class);
}
return mleague_conn;
}
}
在logcat中,onFailure()
出现了。像这样:
okhttp3 <-- END HTTP (8300 byte body) Failer :Failed
为什么 onResponse()
没有被调用?
您正在收到一个响应正文(8300 字节),但正在调用 onFailure
,因为您返回的正文与您的 GSONFactory
不一致。反序列化过程不起作用。正如@yazan 指出的那样,您可以通过打印堆栈跟踪来查明问题。只需输入:
t.printStackTrace()
在 onFailure()
.
编辑:
发生错误是因为您告诉 Retrofit 您需要一个列表,但您得到的是一个 JSON 对象。我快速查看了您正在使用的 API,它看起来像是 returns 一个 JSON 对象,然后返回的对象包含您有兴趣访问的列表。尝试将 List<Root>
的实例替换为 Root
。如需更多帮助,您还可以查看此问题:
我正在从我的 API 电话中收到一个正文,但是 onResponse()
没有被调用,方法如下:
final Rest_manager_league rest = new Rest_manager_league();
Call<List<Root>> listCall = rest.getMLeague_conn().getLeague(x);
listCall.enqueue(new Callback<List<Root>>() {
@Override
public void onResponse(Call<List<Root>> call, Response<List<Root>> response) {
lg = response.body();
Log.d("res", "ON");
if (response.isSuccessful()){
textView.setText(lg.get(3).getStanding().get(2).getTeamName());
Log.d("s", "true");
}
}
@Override
public void onFailure(Call<List<Root>> call, Throwable t) {
Log.d("Failure", "Failed");
}
});
这是 Retrofit 界面和服务:
public interface league_Conn {
@GET("/v1/soccerseasons/{id}/leagueTable")
@Headers("X-Auth-Token:" +
"1869f69f772b40a2a12fd6eefb4e48ef ")
Call<List<Root>> getLeague(@Path("id") int id);
}
public class Rest_manager_league {
private league_Conn mleague_conn;
public league_Conn getMLeague_conn() {
if (mleague_conn == null) {
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client = new OkHttpClient.Builder().addInterceptor(logging).build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://api.football-data.org/")
.addConverterFactory(GsonConverterFactory.create())
.client(client)
.build();
mleague_conn = retrofit.create(league_Conn.class);
}
return mleague_conn;
}
}
在logcat中,onFailure()
出现了。像这样:
okhttp3 <-- END HTTP (8300 byte body) Failer :Failed
为什么 onResponse()
没有被调用?
您正在收到一个响应正文(8300 字节),但正在调用 onFailure
,因为您返回的正文与您的 GSONFactory
不一致。反序列化过程不起作用。正如@yazan 指出的那样,您可以通过打印堆栈跟踪来查明问题。只需输入:
t.printStackTrace()
在 onFailure()
.
编辑:
发生错误是因为您告诉 Retrofit 您需要一个列表,但您得到的是一个 JSON 对象。我快速查看了您正在使用的 API,它看起来像是 returns 一个 JSON 对象,然后返回的对象包含您有兴趣访问的列表。尝试将 List<Root>
的实例替换为 Root
。如需更多帮助,您还可以查看此问题: