【问题标题】:Proxy problems in okhttpokhttp 中的代理问题
【发布时间】:2019-01-28 19:06:21
【问题描述】:

我正在使用 OkHttp 库从我的应用程序向 facebook api 发出请求,但是我需要在代理网络上工作,实例化 OkHttpClient() 并调用 OkHttpClient.newCall(request).execute() 我收到一条超时消息,因为我的代理停止了请求。

经过一番研究,我发现了以下solution

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();

这很好用,但是我不想将代理信息留在代码或应用程序中。

有没有办法将代理配置为环境变量或在 OkHttp 能够完成请求的某些外部文件中?

【问题讨论】:

  • 我不认为 OkHttp 提供任何“魔法”来自动从文件或其他外部资源读取凭据。但是,手动操作应该不难,例如通过使用 System.getenv(name) 读取环境变量

标签: java proxy okhttp3 okhttp


【解决方案1】:

我会使用系统环境变量来存储这个敏感配置。如果您没有属性文件,系统变量将是不错的选择。

您可以将 authenticate 方法更新为:

Authenticator proxyAuthenticator = new Authenticator() {
  @Override public Request authenticate(Route route, Response response) throws 
IOException {
       String username = System.getenv("PROXY_USERNAME");
       String password = System.getenv("PROXY_PASSWORD");
       if (username == null || username.isEmpty() || password == null || password.isEmpty() )
           throw new IllegalStateException("Proxy information is not defined in system variables");

       String credential = Credentials.basic(username, password);
       return response.request().newBuilder()
           .header("Proxy-Authorization", credential)
           .build();
  }
};

并删除

final String username = "username";
final String password = "password";

类字段。

现在,当您运行应用程序时,您可以在计算机本身上定义变量,或者更好地将它们作为参数传递给您的 java 应用程序。例如:

java -jar -DPROXY_USERNAME=userName -DPROXY_PASSWORD=password yourJar.jar

【讨论】:

    猜你喜欢
    • 2016-10-18
    • 2017-01-28
    • 2020-09-18
    • 2016-03-06
    • 2021-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-27
    相关资源
    最近更新 更多