HTTP-запросы с базовой аутентификацией
Мне нужно загружать и анализировать XML файлы с HTTP-сервера с базовой проверкой HTTP. Теперь я делаю так:
URL url = new URL("http://SERVER.WITHOUT.AUTHENTICATION/some.xml");
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(new InputSource(url.openStream()));
doc.getDocumentElement().normalize();
Но таким образом я не могу получить xml (или я просто не знаю этого) документа с сервера с http-аутентификацией.
Буду очень благодарен, если вы сможете показать мне лучший и самый простой способ достичь моей цели.
Ответы
Ответ 1
Вы можете использовать Authenticator
. Например:
Authenticator.setDefault(new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(
"user", "password".toCharArray());
}
});
Это устанавливает значение по умолчанию Authenticator
и будет использоваться во всех запросах. Очевидно, что настройка больше задействована, когда вам не нужны учетные данные для всех запросов или несколько разных учетных данных, возможно, для разных потоков.
В качестве альтернативы вы можете использовать DefaultHttpClient
, где запрос GET с базовой HTTP-аутентификацией будет выглядеть примерно так:
HttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet("http://foo.com/bar");
httpGet.addHeader(BasicScheme.authenticate(
new UsernamePasswordCredentials("user", "password"),
"UTF-8", false));
HttpResponse httpResponse = httpClient.execute(httpGet);
HttpEntity responseEntity = httpResponse.getEntity();
// read the stream returned by responseEntity.getContent()
Я рекомендую использовать последний, потому что он дает вам больше контроля (например, метод, заголовки, тайм-ауты и т.д.) по вашему запросу.
Ответ 2
public String reloadTomcatWebApplication(String user, String pwd, String urlWithParameters, boolean returnResponse) {
URL url = null;
try {
url = new URL(urlWithParameters);
} catch (MalformedURLException e) {
System.out.println("MalformedUrlException: " + e.getMessage());
e.printStackTrace();
return "-1";
}
URLConnection uc = null;
try {
uc = url.openConnection();
} catch (IOException e) {
System.out.println("IOException: " + e.getMessage());
e.printStackTrace();
return "-12";
}
String userpass = user + ":" + pwd;
String basicAuth = "Basic " + javax.xml.bind.DatatypeConverter.printBase64Binary(userpass.getBytes());
uc.setRequestProperty("Authorization", basicAuth);
InputStream is = null;
try {
is = uc.getInputStream();
} catch (IOException e) {
System.out.println("IOException: " + e.getMessage());
e.printStackTrace();
return "-13";
}
if (returnResponse) {
BufferedReader buffReader = new BufferedReader(new InputStreamReader(is));
StringBuffer response = new StringBuffer();
String line = null;
try {
line = buffReader.readLine();
} catch (IOException e) {
e.printStackTrace();
return "-1";
}
while (line != null) {
response.append(line);
response.append('\n');
try {
line = buffReader.readLine();
} catch (IOException e) {
System.out.println(" IOException: " + e.getMessage());
e.printStackTrace();
return "-14";
}
}
try {
buffReader.close();
} catch (IOException e) {
e.printStackTrace();
return "-15";
}
System.out.println("Response: " + response.toString());
return response.toString();
}
return "0";
}
Ответ 3
Используйте HttpClient. Документация для выполнения загрузки с HTTP AUTH здесь. Документация для получения результата строки здесь. Затем проанализируйте свою строку (в идеале используя SAX, но не DOM).
Ответ 4
- DefaultHttpClient устарел
- addHeader должен иметь 2 параметра
Обновлен блок кода с использованием HttpClient 4.5.2
HttpClient httpClient = HttpClientBuilder.create().build();
HttpGet httpGet = new HttpGet("https://test.com/abc.xyz");
httpGet.addHeader("Authorization", BasicScheme.authenticate(new UsernamePasswordCredentials("login", "password"), "UTF-8"));
HttpResponse httpResponse = httpClient.execute(httpGet);
HttpEntity responseEntity = httpResponse.getEntity();