与retrofit2&OkHttp3得到这个错误。 无法parsing主机“<主机名>”:没有与主机名关联的地址

我正在使用retrofit 2和OkHttp3从服务器请求数据。 我刚刚添加了一个脱机caching代码,但它没有按预期工作。 我收到错误“无法parsing主机”<>“:没有与主机名关联的地址。”

当它尝试从caching中获取检索数据时(当没有Internet连接时),就会发生这种情况。 下面的代码片段。

public static Interceptor provideCacheInterceptor() { return new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Response response = chain.proceed(chain.request()); // re-write response header to force use of cache CacheControl cacheControl = new CacheControl.Builder() .maxAge(2, TimeUnit.MINUTES) .build(); return response.newBuilder() .header(CACHE_CONTROL, cacheControl.toString()) .build(); } }; } public static Interceptor provideOfflineCacheInterceptor() { return new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); if (!hasNetwork) { CacheControl cacheControl = new CacheControl.Builder() .onlyIfCached() .maxStale(7, TimeUnit.DAYS) .build(); request = request.newBuilder() .removeHeader("Pragma") .cacheControl(cacheControl) .build(); } return chain.proceed(request); } }; } private static Cache provideCache() { Cache cache = null; try { cache = new Cache(new File(AdeptAndroid.getInstance().getCacheDir(), "http-cache"), 10 * 1024 * 1024); // 10 MB } catch (Exception e) { Log.d("Test", "Could not create Cache!"); } return cache; } 

最后一个结合所有这些的方法在这里。

 private static OkHttpClient provideOkHttpClient() { return new OkHttpClient.Builder() .addInterceptor(provideHttpLoggingInterceptor()) .addInterceptor(provideOfflineCacheInterceptor()) .addNetworkInterceptor(provideCacheInterceptor()) .cache(provideCache()) .build(); } 

Solutions Collecting From Web of "与retrofit2&OkHttp3得到这个错误。 无法parsing主机“<主机名>”:没有与主机名关联的地址"

您的服务器响应具有“Pragma:no-cache”标题。 你应该在响应拦截器中删除这个头,而不是你的请求拦截器。

在你当前的代码中,你已经从请求拦截器中删除了它。

您的provideCacheInterceptor()应该看起来像这样:

 public static Interceptor provideCacheInterceptor() { return new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Response response = chain.proceed(chain.request()); // re-write response header to force use of cache CacheControl cacheControl = new CacheControl.Builder() .maxAge(2, TimeUnit.MINUTES) .build(); return response.newBuilder() .header(CACHE_CONTROL, cacheControl.toString()) .removeHeader("Pragma") .build(); } }; }