使用okHttp不走代理问题

这篇具有很好参考价值的文章主要介绍了使用okHttp不走代理问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景

某日使用okhttp设置代理并发送爬虫请求时,发现部分url请求没有走代理直接和目标url建立了连接,伪代码如下。初始化okhttpClient时设置了proxySelecter代理,但是调用okhttpClient.newCall请求时并没用调用proxySelecter.select函数获取代理,日志也没有打印。

    public void call(String url) {
        ProxySelector proxySelector = new ProxySelector() {
            @Override
            public List<Proxy> select(URI uri) {
                log.info("run into proxy");
                Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 80));
                return Collections.singletonList(proxy);
            }

            @Override
            public void connectFailed(URI uri, SocketAddress sa, IOException ioe) {
                return;
            }
        };
        OkHttpClient client = new OkHttpClient.Builder().proxySelector(proxySelector).build();
        okhttp3.Request request = new Request.Builder()
            .url(url).build();

        client.newCall(request);
    }
okHttp & 代理
Android | 彻底理解 OkHttp 代理与路由
为什么没走代理

okhttp选择proxy时,现将传入的url传换为uri,如果uri的host为空,okhttp选择直连url,放弃走代理

okhttp3.internal.connection.RouteSelector
  private fun resetNextProxy(url: HttpUrl, proxy: Proxy?) {
    fun selectProxies(): List<Proxy> {
      // If the user specifies a proxy, try that and only that.
      if (proxy != null) return listOf(proxy)

      // If the URI lacks a host (as in "http://</"), don't call the ProxySelector.
      val uri = url.toUri()
      //此处,如果host解析出来为null。放弃走设置的代理
      if (uri.host == null) return immutableListOf(Proxy.NO_PROXY)

      // Try each of the ProxySelector choices until one connection succeeds.
      val proxiesOrNull = address.proxySelector.select(uri)
      if (proxiesOrNull.isNullOrEmpty()) return immutableListOf(Proxy.NO_PROXY)

      return proxiesOrNull.toImmutableList()
    }

    eventListener.proxySelectStart(call, url)
    proxies = selectProxies()
    nextProxyIndex = 0
    eventListener.proxySelectEnd(call, url, proxies)
  }

 val uri = url.toUri() 函数扒到底,实际获取hostName的执行代码如下。java.net.Uri包解uri时,如果uri的host不合法,则降级设置host为null。

java.net.uri类节选代码
  private int parseAuthority(int start, int n)
            throws URISyntaxException
        {
            ...

            if (serverChars) {
                // Might be (probably is) a server-based authority, so attempt
                // to parse it as such.  If the attempt fails, try to treat it
                // as a registry-based authority.
                try {
                    //此处解析hostName,不合法的话会扔出URISyntaxException异常
                    q = parseServer(p, n);
                    if (q < n)
                        failExpecting("end of authority", q);
                    authority = substring(p, n);
                } catch (URISyntaxException x) {
                    // Undo results of failed parse
                    userInfo = null;
                    //host被赋值为空指针
                    host = null;
                    port = -1;
                    if (requireServerAuthority) {
                        // If we're insisting upon a server-based authority,
                        // then just re-throw the exception
                        throw x;
                    } else {
                        // 
                        ex = x;
                        q = p;
                    }
                }
            }

            ...

            return n;
        }

参考:JDK(java.net.URL) 中的 一个 "bug" | 唐磊的个人博客文章来源地址https://www.toymoban.com/news/detail-629592.html

到了这里,关于使用okHttp不走代理问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • springboot引入minio导致的okhttp、kotlin的版本冲突问题

    问题背景 项目中需要引入minio,添加了如下依赖 结果运行报错: 解决过程 1. 看到 Unsupported OkHttp library found. Must use okhttp = 4.8.1 ,以为是之前引入的okhttp的版本太低,于是将   okhttp  升到   4.8.1  ,还是报同样错误 2. 上网查了一下,说需要在minio的依赖中排除okhttp依赖,再引

    2024年04月26日
    浏览(39)
  • okhttp post请求 header post参数加密遇到的两个问题

    如果你对于网络请求用了https后是否还有必要对参数加密有疑问可以看我上篇的文章:网络安全https 记得耐心看完,下面说问题: Caused by: java.lang.IllegalArgumentException: Unexpected char 0x0a 一开始以为是okhttp框架对特殊字符做了现在,网上其他文章说的是对中文字符,我想我这也没

    2024年02月06日
    浏览(51)
  • Kotlin 中 OkHttp 使用及解析

    1、通过 Builder 模式得到  okHttpClient ,OkHttpClient 包含了对网络请求的全局配置信息,包括 链接超时时间、读写超时时间、链接失败重试 等配置。 2、通过 Builder 模式得到 request ,Request 包含了本次网络请求的所有请求参数,包括 url、method、headers、body 等。 3、通过 newCall 方法

    2024年02月10日
    浏览(39)
  • Android 使用okhttp监控网络数据

    这里使用Okhttp写了一个demo来监听网络请求过程中的一系列数据,包括当前网络类型、请求体、响应体大小,url,请求方式,当然还有本次核心获取域名解析时长,建立连接时长,保持连接时长,请求总时长这些数据。 一次网络请求经历了哪些过程 通过域名访问的方式来请求

    2024年02月11日
    浏览(45)
  • Android OKhttp使用(下载和上传文件)

    首先在build.gradle中引入okhttp 下面是demo(用okthttp下载网络上的资源) 用okthttp将资源上传至网络

    2024年02月11日
    浏览(51)
  • Okhttp-LoggingInterceptor的简单使用

    概述 Okhttp除了提供强大的get,post网络请求外,还包含请求日志的拦截器,可以 监视,重写,重试 调用请求。 简单使用 我们在构造OkHttpClient时,通过 addInterceptor () 方法添加我们需要的过滤器。 httpLoggingInterceptor 使用默认的 httpLoggingInterceptor 打印日志如下,可以发现,除了关

    2024年02月16日
    浏览(27)
  • Spring boot 使用 Okhttp3

    Spring boot 集成 okhttp3, 使用 http,https 在项目调用第三方服务是在所难免的,运用传统类型的Http调用,封装繁琐,代码量多还不简洁,避免一次一次的 找 度娘, 小记一下。 引入jar OkRestClient 工具类 OkHttp动态配置 使用 OkHttp 使用OkHttp 时 只需要注入 @AutoWired OkRestClient okRestC

    2024年02月11日
    浏览(48)
  • Http客户端OkHttp的基本使用

    OkHttp是一个强大的开源HTTP客户端,它被广泛用于Android和Java应用程序中。OkHttp具有简单易用的API,提供了许多高级功能,如连接池、请求压缩和缓存等。 要使用OkHttp,需要在项目的构建文件中添加以下依赖: 请将 x.x.x 替换为您希望使用的OkHttp版本号。 GET请求 以下是发送G

    2024年02月09日
    浏览(59)
  • 【Android】OkHttp+Retrofit+Flow的简单使用

    实现一个简单的登录功能 引入依赖 我们现在有这样一个 Body 请求参数 当使用 post 请求之后,获取返回的数据 当允许登录的话,这个值就是 true 我们先创建两个数据Bean类 然后我们再创建一个密封类处理返回结果的分类 我们再创建一个Retrofit+OkHttp的单例类 好了,接下来再创

    2024年02月12日
    浏览(43)
  • Android之网络请求2————OkHttp的基本使用

    1.概述 okhttp是一个第三方库,用于Android中网络请求 这是一个开源项目,是安卓端最火热的轻量级框架,由移动支付Square公司贡献(该公司还贡献了Picasso和LeakCanary) 。用于替代HttpUrlConnection和Apache HttpClient(android API23 里已移除HttpClient)。 2.OkHttp于http的请求 我们先构造一个一个http请

    2024年02月01日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包