Подтвердить что ты не робот

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-аутентификацией.

Буду очень благодарен, если вы сможете показать мне лучший и самый простой способ достичь моей цели.

4b9b3361

Ответ 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();