java - okhttp 中的代理问题
问题描述
我正在使用OkHttp库从我的应用程序向 facebook api 发出请求,但是我需要在代理网络上工作,实例化OkHttpClient()
并调用OkHttpClient.newCall(request).execute()
我收到超时消息,因为我的代理停止了请求。
经过一番研究,我找到了以下解决方案:
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 能够完成请求的一些外部文件中?
解决方案
我会使用系统环境变量来存储这个敏感配置。如果您没有属性文件,系统变量将是一个不错的选择。
您可以将身份验证方法更新为此:
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
推荐阅读
- django - 为一对多关系编写 django 查询,(django 查询和 taggit)
- python - 为列名添加空格
- javascript - 我想在几秒钟后执行 JavaScript 代码
- azure - Service Fabric:System.IndexOutOfRangeException -“System.RA”报告属性“ReplicaOpenStatus”的警告
- excel - 电源查询连接刷新时的消息框
- php - DataTables Jquery File Export 没有显示按钮
- razor - 出现错误“未定义索引:razorpay_payment_id”
- amazon-web-services - 当我们创建 AWS eks 集群时,管理工作节点的主节点在哪里?
- html - 如何仅使用 CSS 添加位于标题文本下方一半的颜色条?只用颜色填充 div 的下半部分?
- dataframe - 按条件将列从 df2 添加到 df1