http-post 通过代理不起作用
http-post through proxy not working
我可以使用 chrome 浏览器访问 https://pushover.net/,但是当我尝试使用 java 访问同一网站时连接到 api 并发送数据它失败了。
这是我的代码
HttpClient httpClient = (HttpClient) HttpClientBuilder.create()/*.setProxy(proxy)*/.build();
HttpPost post = new HttpPost("https://api.pushover.net/1/messages.json");
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
nvps.add(new BasicNameValuePair("token", apiToken));
nvps.add(new BasicNameValuePair("user", userKey));
nvps.add(new BasicNameValuePair("message", message));
post.setEntity(new UrlEncodedFormEntity(nvps, Charset.defaultCharset()));
//point A
HttpResponse deviceResponse = httpClient.execute(post);
//point B
它到达了 A 点,但随后需要很长时间才能到达 B 点,并且在它到达时给出了一个异常。
例外是
org.apache.http.conn.HttpHostConnectException:连接到 api.pushover.net:443(api.pushover.net/108.59.13.232] 失败:连接超时:连接。
我已经尝试使用代理,下面的代码在其余代码之上
HttpHost proxy = new HttpHost("url",9090,"https");
httpClient = (HttpClient) HttpClientBuilder.create().setProxy(proxy).build();
这给了我一个
javax.net.ssl.SSLHandshakeException: 握手期间远程主机关闭连接
然后我也尝试添加
Authenticator.setDefault(
new Authenticator() {
@Override
public PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(
authUser, authPassword.toCharArray());
}
}
);
System.setProperty("http.proxyUser", authUser);
System.setProperty("http.proxyPassword", authPassword);
但它给出了相同的 SSLHandshakeException。
我见过创建密钥库的东西,但这只适用于我的机器,我想要一些可以在代码中运行的东西,并允许我将这个应用程序部署到 1000 台机器上,而无需进行额外的手动配置每个。
有什么我应该做的更好的事情吗?
我已经用这段代码代替开头的 httpClient
修复了它。
HttpHost proxy = new HttpHost(PROXY_URL, 8080);
DefaultProxyRoutePlanner routePlanner = new DefaultProxyRoutePlanner(proxy);
AuthCache authCache = new BasicAuthCache();
CredentialsProvider credsProvider = new BasicCredentialsProvider();
credsProvider.setCredentials(new AuthScope(PROXY_URL, 8080, AuthScope.ANY_HOST, "ntlm"), new NTCredentials(authUser, authPassword, "",PROXY_DOMAIN));
HttpClientContext context = HttpClientContext.create();
context.setCredentialsProvider(credsProvider);
context.setAuthCache(authCache);
httpClient = HttpClients.custom().setDefaultCredentialsProvider(credsProvider).setRoutePlanner(routePlanner).build();
我可以使用 chrome 浏览器访问 https://pushover.net/,但是当我尝试使用 java 访问同一网站时连接到 api 并发送数据它失败了。
这是我的代码
HttpClient httpClient = (HttpClient) HttpClientBuilder.create()/*.setProxy(proxy)*/.build();
HttpPost post = new HttpPost("https://api.pushover.net/1/messages.json");
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
nvps.add(new BasicNameValuePair("token", apiToken));
nvps.add(new BasicNameValuePair("user", userKey));
nvps.add(new BasicNameValuePair("message", message));
post.setEntity(new UrlEncodedFormEntity(nvps, Charset.defaultCharset()));
//point A
HttpResponse deviceResponse = httpClient.execute(post);
//point B
它到达了 A 点,但随后需要很长时间才能到达 B 点,并且在它到达时给出了一个异常。 例外是 org.apache.http.conn.HttpHostConnectException:连接到 api.pushover.net:443(api.pushover.net/108.59.13.232] 失败:连接超时:连接。
我已经尝试使用代理,下面的代码在其余代码之上
HttpHost proxy = new HttpHost("url",9090,"https");
httpClient = (HttpClient) HttpClientBuilder.create().setProxy(proxy).build();
这给了我一个 javax.net.ssl.SSLHandshakeException: 握手期间远程主机关闭连接
然后我也尝试添加
Authenticator.setDefault(
new Authenticator() {
@Override
public PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(
authUser, authPassword.toCharArray());
}
}
);
System.setProperty("http.proxyUser", authUser);
System.setProperty("http.proxyPassword", authPassword);
但它给出了相同的 SSLHandshakeException。
我见过创建密钥库的东西,但这只适用于我的机器,我想要一些可以在代码中运行的东西,并允许我将这个应用程序部署到 1000 台机器上,而无需进行额外的手动配置每个。
有什么我应该做的更好的事情吗?
我已经用这段代码代替开头的 httpClient
修复了它。
HttpHost proxy = new HttpHost(PROXY_URL, 8080);
DefaultProxyRoutePlanner routePlanner = new DefaultProxyRoutePlanner(proxy);
AuthCache authCache = new BasicAuthCache();
CredentialsProvider credsProvider = new BasicCredentialsProvider();
credsProvider.setCredentials(new AuthScope(PROXY_URL, 8080, AuthScope.ANY_HOST, "ntlm"), new NTCredentials(authUser, authPassword, "",PROXY_DOMAIN));
HttpClientContext context = HttpClientContext.create();
context.setCredentialsProvider(credsProvider);
context.setAuthCache(authCache);
httpClient = HttpClients.custom().setDefaultCredentialsProvider(credsProvider).setRoutePlanner(routePlanner).build();