当前位置: 首页 > 知识库问答 >
问题:

Java 11 HttpClient通过代理请求HTTPS资源

陆宏扬
2023-03-14

需要通过代理执行REST请求。有几个HTTP代理服务器可用,受基本身份验证的保护。使用Java16。

访问HTTP资源时完全工作的请求示例

var proxySettings = new ProxySettings("http", "proxy.ip.address", proxy.port, "userName", "password");

var request = HttpRequest.newBuilder(new URI("http://tv-games.ru")).build();

HttpClient client = HttpClient.newBuilder()
        .proxy(ProxySelector.of(new InetSocketAddress(proxySettings.getUri(), proxySettings.port())))
        .authenticator(new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(proxySettings.userName(), proxySettings.getPasswordArray());
            }
        }).build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());

System.out.println("Body: " + response.body());
System.out.println("Code: " + response.statusCode());
public record ProxySettings(String scheme, String hostname, int port, String userName, String password) {

        public char[] getPasswordArray() {
            return password.toCharArray();
        }

        public String getUri() {
            return scheme + "://" + hostname;
        }
    }
HttpHost targetHost = new HttpHost("https", "yandex.ru");
HttpHost proxyHost = new HttpHost(proxySettings.scheme(), proxySettings.hostname(), proxySettings.port());

//Create the HttpGet request object
HttpGet httpget = new HttpGet("/");
httpget.setConfig(RequestConfig.custom().setProxy(proxyHost).build());

//Create the CloseableHttpClient
CredentialsStore credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(new AuthScope(proxySettings.hostname(), proxySettings.port()),
        new UsernamePasswordCredentials(proxySettings.userName(), proxySettings.getPasswordArray()));

CloseableHttpClient client = HttpClients.custom().setDefaultCredentialsProvider(credentialsProvider).build();

//Get the result
CloseableHttpResponse closeableHttpResponse = client.execute(targetHost, httpget);
System.out.println("Body: " + EntityUtils.toString(closeableHttpResponse.getEntity()));
System.out.println("Code: " + httpResponse.code());

EntityUtils.consume(closeableHttpResponse.getEntity());

共有1个答案

夹谷俊远
2023-03-14

看看这本指南的第4和第5部分,我想,这是你需要的。

 类似资料:
  • 问题内容: 我正在尝试使用HttpsUrlConnection类将请求发送到服务器。服务器存在证书问题,因此我设置了一个可信任所有内容的TrustManager以及同样宽松的主机名验证程序。当我直接发出请求时,此管理器工作正常,但是当我通过代理发送请求时,似乎根本没有使用过。 我这样设置代理设置: 默认SSLSocketFactory的TrustManager的设置如下: 如果运行以下代码,则最终

  • 问题内容: 如何通过 HTTPS* 发送ajax GET 请求? * 抛出这个: 是否有其他方法或解决方法可以使此工作正常进行? 如果我使用 Chrome 浏览到该网址,则可以得到响应。我认为没有理由为什么它不能在ajax请求上正常工作。 问题答案: 如果您由于当前处于 同一来源策略 而无法访问该页面,则无法向该页面发出AJAX请求。 **** 的 主机 , 端口 和 方案 (协议)必须在为了使A

  • 假设您想对某个网站执行https请求,但中间有一个代理。 上述代理不查看请求,只是在用户代理使用HTTP连接方法后将所有流量中继到实际的HTTPS服务器(如中所示http://www.web-cache.com/Writings/Internet-Drafts/draft-luotonen-web-proxy-tunneling-01.txt)。 现在我的问题是:在代理打开到目标Web服务器的SS

  • 问题内容: 通过AJAX从标准HTTP页面调用HTTPS页面(例如信用卡授权服务,例如WorldPay)是否会有问题? 我无法想象为什么会有问题,响应将是HTML页面,然后我可以将其嵌入结果窗格或类似的页面? 问题答案: 是的,这将是跨域发布,并且将被浏览器阻止。

  • 问题内容: 我知道以前已经以各种形式询问过这个问题,但是我似乎无法解决这个问题。我尝试使用jQuery和本机JS API发出Ajax请求。 我的情况如下(参见附图): 浏览器发出HTTP请求 服务器响应并设置持久性Cookie 浏览器发出HTTP Ajax请求,Cookie在那里 服务器响应预期,更新Cookie 浏览器发出HTTPS Ajax请求,Cookie不再存在(?!) 由于没有Cooki

  • 问题内容: 我的网站上有一些关于HTTPS连接的页面。从这些HTTPS页面中,我必须使用HTTP Ajax请求来进行一些错误检索,例如空白字段。但是此错误消息不会出现。是否有解决方案,或者我必须提出AJAX请求以通过HTTPS连接进行归档? 问题答案: 由于同源政策,这是不可能的。 您还需要将Ajax请求切换为https。