Android Studio用Retrofit请求000webhost接口无响应如何解决
解决方法
你遇到的401未授权问题是接口开启了HTTP Basic身份验证导致,浏览器访问时会自动弹出认证窗口,输入过凭证后会缓存所以可以正常访问,Postman和Retrofit默认不会携带认证头所以会报错,你可以通过以下两种方式配置身份信息:
方案1:全局添加身份认证拦截器(推荐,适合所有接口统一认证场景)
直接在APIRetrofitClient的OkHttpClient配置中添加认证拦截器,所有通过这个Retrofit实例发起的请求都会自动携带认证头,修改后的getClient方法代码如下:
public static Retrofit getClient(String base_url){ // 新增身份认证拦截器 Interceptor authInterceptor = chain -> { Request originalRequest = chain.request(); // 替换成你接口对应的真实用户名和密码 String authCredential = Credentials.basic("你的用户名", "你的密码"); Request authedRequest = originalRequest.newBuilder() .addHeader("Authorization", authCredential) .build(); return chain.proceed(authedRequest); }; OkHttpClient okHttpClient = new OkHttpClient.Builder() .addInterceptor(authInterceptor) // 把拦截器添加到OkHttp配置中 .readTimeout(10000, TimeUnit.MILLISECONDS) .writeTimeout(10000, TimeUnit.MILLISECONDS) .connectTimeout(10000, TimeUnit.MILLISECONDS) .retryOnConnectionFailure(true) .protocols(Arrays.asList(Protocol.HTTP_1_1)) .build(); Gson gson = new GsonBuilder().setLenient().create(); retrofit = new Retrofit.Builder() .baseUrl(base_url) .client(okHttpClient) .addConverterFactory(GsonConverterFactory.create(gson)) .build(); return retrofit; }
注意:需要导入
okhttp3.Credentials、okhttp3.Interceptor、okhttp3.Request相关依赖包。
方案2:单个请求单独配置认证头(适合仅部分接口需要认证的场景)
不需要修改全局配置,直接在你的DataService接口中给对应请求添加认证头即可,有两种写法:
固定认证信息写法
public interface DataService { // 替换value值为你自己的Base64加密后的 用户名:密码 字符串,也可以直接用Credentials生成后复制过来 @Headers("Authorization: Basic 你的加密后认证字符串") @GET("songbannner.php") Call<List<Ads>> GetDataBanner(); }
动态传参写法
public interface DataService { @GET("songbannner.php") Call<List<Ads>> GetDataBanner(@Header("Authorization") String authCredential); }
调用时传入认证信息即可:
Call<List<Ads>> callback = dataService.GetDataBanner(Credentials.basic("你的用户名", "你的密码"));
验证及排查建议
- 配置前可以先在Postman中验证凭证是否正确:打开Postman对应请求的
Authorization标签,Type选择Basic Auth,输入用户名密码后发送请求,能正常返回数据再配置到Android代码中。 - 建议在请求的
onFailure回调中添加错误日志打印,方便排查其他可能的问题:@Override public void onFailure(Call<List<Ads>> call, Throwable t) { Log.e("请求失败", t.getMessage(), t); } - 如果接口是Bearer Token认证,只需要把
Authorization头的value改为Bearer 你的token字符串即可,配置逻辑一致。
内容的提问来源于stack exchange,提问作者Cody
相关产品推荐
相关产品推荐

