Android使用Retrofit请求接口时Callback始终触发onFailure无响应如何解决
问题原因及解决方案
1. 优先检查Android明文流量限制
Android 9(API Level 28)及以上系统默认禁止HTTP明文网络请求,你当前使用的BASE_URL是http://huseyinozkoc.com/,属于HTTP协议,会被系统拦截导致请求失败。
解决方案:
- 方案1:将服务端升级为HTTPS协议,修改BASE_URL为HTTPS开头的地址,推荐使用该方案。
- 方案2:临时兼容HTTP请求,在
res/xml目录下新建network_security_config.xml文件,内容如下:
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config cleartextTrafficPermitted="true"> <domain includeSubdomains="true">huseyinozkoc.com</domain> </domain-config> </network-security-config>
然后在AndroidManifest.xml的<application>标签中添加属性:
android:networkSecurityConfig="@xml/network_security_config"
2. 增加错误日志定位具体问题
你当前onFailure回调中仅弹出Toast,没有打印错误栈信息,无法定位具体报错原因,修改onFailure代码:
@Override public void onFailure(Call<PlaceCevap> call, Throwable t) { // 打印错误日志,Logcat中过滤TAG即可查看具体错误 Log.e("RetrofitError", "请求失败", t); Toast.makeText(MainActivity.this, "fail" , Toast.LENGTH_SHORT).show(); }
常见错误类型可以通过日志快速判断:
- 连接超时:检查服务端是否正常运行、端口是否对外开放、设备和服务端网络是否连通
- Gson解析错误:检查
PlaceCevap实体类结构是否和接口返回的JSON结构完全匹配,字段名、字段类型是否一致,是否遗漏必要的@SerializedName注解
3. 增加网络请求日志查看请求详情
引入OkHttp的日志拦截器,查看请求的完整地址、参数、响应头等信息,确认请求拼接是否正确:
步骤1:添加依赖(模块级build.gradle)
implementation 'com.squareup.okhttp3:logging-interceptor:4.10.0'
步骤2:修改RetrofitClient类,添加OkHttp配置
import okhttp3.OkHttpClient; import okhttp3.logging.HttpLoggingInterceptor; import retrofit2.Retrofit; import retrofit2.converter.gson.GsonConverterFactory; public class RetrofitClient { private static Retrofit retrofit = null; public static Retrofit getClient(String baseUrl) { if (retrofit==null) { // 配置日志拦截器 HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(); loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(loggingInterceptor) .build(); retrofit = new Retrofit.Builder() .baseUrl(baseUrl) .client(client) .addConverterFactory(GsonConverterFactory.create()) .build(); } return retrofit; } }
配置后可以在Logcat中过滤OkHttp标签查看完整的请求和响应内容,确认拼接后的请求地址是否为http://huseyinozkoc.com/turkey/get_All_details.php,直接访问该地址确认返回内容是否符合预期。
4. 确认网络权限配置
再次检查AndroidManifest.xml中是否已正确添加网络权限,权限需要放在<application>标签外:
<uses-permission android:name="android.permission.INTERNET" />
内容的提问来源于stack exchange,提问作者Hüseyin Özkoç
相关产品推荐
相关产品推荐

