OkHttp3 的非代理主机

Non proxy hosts for OkHttp3

如何设置哪些主机名不应该传递给 OkHttpClient 使用代理发出的一个请求?

OkHttp3 中的 vm 参数 -Dhttp.nonProxyHosts 是否有等价物?

例如:

final OkHttpClient okHttpClient = new OkHttpClient
    .Builder()
    .connectTimeout(60, TimeUnit.SECONDS)
    .writeTimeout(60, TimeUnit.SECONDS)
    .readTimeout(60, TimeUnit.SECONDS)
    .proxy(new Proxy(Proxy.Type.HTTP,
        new InetSocketAddress(defaultProxyHostName, Integer.parseInt(defaultProxyPort))))
    .build();

您要查找的 API 是 ProxySelector。您可以在 OkHttpClient 上进行配置。

经过一番挖掘,我找到了如何去做。

所以我必须创建一个 ProxySelector 来实现何时应用或不应用代理的逻辑。

示例:

final ProxySelector proxySelector = new ProxySelector() {
    @Override
    public java.util.List<Proxy> select(final URI uri) {
        final List<Proxy> proxyList = new ArrayList<Proxy>(1);

        // Host
        final String host = uri.getHost();

        // Is an internal host
        if (host.startsWith("127.0.0.1") || StringUtils.contains(nonProxyHostsValue, host)) {
            proxyList.add(Proxy.NO_PROXY);
        } else {
            // Add proxy
            proxyList.add(new Proxy(Type.HTTP,
                    new InetSocketAddress(proxyHostNameValue, Integer.parseInt(proxyPortValue))));
        }

        return proxyList;
    }

    @Override
    public void connectFailed(URI arg0, SocketAddress arg1, IOException arg2) {
        throw new UnsupportedOperationException("Not supported yet.");
    }
};

// Set proxy selector
okHttpClientBuilder.proxySelector(proxySelector);

你可以尝试传递参数

-Dhttp.nonProxyHosts=localhost|127.0.0.1|*.example.com