Java-запрос через прокси с учетными данными
Я не могу получить реализацию Java, чтобы сделать http-запрос через прокси с учетными данными.
Теперь я вынужден использовать скрипт bash curl --proxy-user username:password ...
, Есть ли способ сделать то же самое в Java?
UPD: так как аутентификация моего прокси-соединения не является обязательной, я должен сделать прокси для использования учетных данных, как в примере с curl
2 ответа
Если вы используете Java 6 или выше, вы можете использовать класс Proxy.
https://docs.oracle.com/javase/7/docs/api/java/net/Proxy.html
Пример использования будет выглядеть ниже
HttpURLConnection conn;
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("www.proxyserver.com", YOUR_PROXY_PORT));
URL httpUrl = new URL("http://www.google.com");
conn = (HttpURLConnection) httpUrl.openConnection(proxy);
Чтобы подтвердить ваш доступ https://docs.oracle.com/javase/7/docs/api/java/net/Authenticator.html
Authenticator.setDefault(new MyAuthenticator());
public class MyAuthenticator extends Authenticator {
protected PasswordAuthentication getPasswordAuthentication() {
String username = "yourUserName";
String password = "YourPassword";
return new PasswordAuthentication(username, password.toCharArray());
}
}
После долгого серфинга я получил этот ответ, который идеально подходит для моего вопроса.
Создайте класс Rest Client Base, чтобы его можно было применить для всех остальных вызовов шаблона.
открытый класс RestClientBase { частный RestTemplate restTemplate = null;
protected RestTemplate getTemplate() {
string username = "username";
String Password = "password";
if (restTemplate == null) {
SimpleClientHttpRequestFactory clientHttpReq = new SimpleClientHttpRequestFactory();
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("Proxy URL", PROXY_PORT)); // PROXY PORT needs to be integer
clientHttpReq.setProxy(proxy);
restTemplate = new RestTemplate(clientHttpReq);
restTemplate.getInterceptors().add(new BasicAuthenticationInterceptor(username, Password));
}
return restTemplate;
}
}
Теперь наследуйте этот класс в своем фактическом клиентском классе отдыха, где вы вызываете другую конечную точку API.
открытый класс ActualClientClass расширяет RestClientBase {
public String invokeActualService(String restAPINeedingUserNamePwdURL, class.String) {
String result = getTemplate().getForObject(restAPINeedingUserNamePwdURL, String.class);
}
}
Просто чтобы подчеркнуть, это точно выполняет ту же задачу, что и curl --proxy-user username:password