【问题标题】:OkHTTPClient Proxy authentication how to?OkHTTPClient 代理认证怎么做?
【发布时间】:2016-06-03 22:09:06
【问题描述】:

问题:如何向 OkHTTP 添加授权代理。

我知道 OkHTTP 的构建器 does support proxies 虽然我很难设置它。

/**
 * Given a Url and a base64 encoded password return the contents of a website.
 * @param urlString
 * @param password
 * @return JSON
 */
public String getURLJson(String urlString, String password) {       
        OkHttpClient client = new OkHttpClient.Builder()
                .connectTimeout(60, TimeUnit.SECONDS)
                .writeTimeout(60, TimeUnit.SECONDS)
                .readTimeout(60, TimeUnit.SECONDS)
                .build();

        Request request = new Request.Builder()
          .url(urlString)
          .get()
          .addHeader("authorization", "Basic " + password)
          .addHeader("cache-control", "no-cache")
          .build();

        Response response = null;
        try {
            response = client.newCall(request).execute();
            String string = response.body().string();
            response.body().close();
            return string;
        } catch (IOException e) {
            System.err.println("Failed scraping");
            e.printStackTrace();
        }
        return "failed";
    }

我有 IP / 端口 / 用户名 / 密码。

虽然我不知道如何将它们转换为 Proxy proxy,然后可以在 client.SetProxy() 中使用。

这似乎过于复杂,我似乎无法弄清楚。任何帮助将不胜感激。

【问题讨论】:

    标签: java proxy okhttp okhttp3


    【解决方案1】:

    试试这个:

    int proxyPort = 8080;
    String proxyHost = "proxyHost";
    final String username = "username";
    final String password = "password";
    
    Authenticator proxyAuthenticator = new Authenticator() {
      @Override public Request authenticate(Route route, Response response) throws IOException {
           String credential = Credentials.basic(username, password);
           return response.request().newBuilder()
               .header("Proxy-Authorization", credential)
               .build();
      }
    };
    
    OkHttpClient client = new OkHttpClient.Builder()
        .connectTimeout(60, TimeUnit.SECONDS)
        .writeTimeout(60, TimeUnit.SECONDS)
        .readTimeout(60, TimeUnit.SECONDS)
        .proxy(new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost, proxyPort)))
        .proxyAuthenticator(proxyAuthenticator)
        .build();
    

    【讨论】:

    • 似乎没有对代理进行身份验证。我已经设法让它与带有这些详细信息的命令行curl -x user:passS@proxy:port address 一起工作,尽管您的 aove 似乎没有经过身份验证。我收到错误消息Access Denied (authentication_failed)
    • 什么HTTP响应代码?使用代理身份验证器,OkHttp 应该在向调用者显示该错误之前重试重新验证代理。
    • 对我来说也不行。我总是得到返回 407 Proxy Authentication Required。卷曲正在工作。
    • 仅供参考,当用户名和密码不正确时,代码会抛出 java.lang.RuntimeException: java.net.ProtocolException: Too many follow-up requests: 21。尝试和测试,它的工作原理。请参阅github.com/http-builder-ng/http-builder-ng/issues/191 获取我的代码 sn-p。
    • @JesseWilson Authenticator 的解决方案适合我(使用 okhttp 4.3.0)。谢谢。但是,当我通过 Request.Builder 手动添加 Proxy-Authorization 标头时,它不起作用。我用 curl 仔细检查了我使用的标题是否正确。 okhttp 是否在内部做了一些不明显的魔法?这不是问题,但知道会很有趣。
    猜你喜欢
    • 2016-12-23
    • 2018-09-29
    • 2013-02-23
    • 2016-12-04
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多