具有基本身份验证的HTTP请求

时间:2011-01-07 15:57:08

标签: java android

我必须从http服务器下载并解析XML文件 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();

但是通过这种方式,我无法通过http身份验证从服务器获取xml(或者我只是不知道)。

如果你能告诉我实现目标的最佳和最简单的方法,我将非常感激。

5 个答案:

答案 0 :(得分:57)

您可以使用Authenticator。例如:

Authenticator.setDefault(new Authenticator() {
 @Override
        protected PasswordAuthentication getPasswordAuthentication() {
         return new PasswordAuthentication(
   "user", "password".toCharArray());
        }
});

这会设置默认Authenticator,并将在所有请求中使用。显然,当您不需要所有请求的凭据或许多不同的凭据(可能在不同的线程上)时,设置会更复杂。

或者,您可以使用DefaultHttpClient,其中具有基本HTTP身份验证的GET请求类似于:

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()

我建议使用后者,因为它可以为您提供更多控制权(例如方法,标题,超时等)。

答案 1 :(得分:6)

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";
}

答案 2 :(得分:2)

使用HttpClient。使用HTTP AUTH执行下载的文档是here。获取字符串结果的文档是here。然后,解析你的字符串(理想情况下使用SAX,而不是DOM)。

答案 3 :(得分:1)

  • 不推荐使用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();

答案 4 :(得分:0)

正如 Gabe Rogan 提到的,“BasicScheme 中的身份验证方法已被弃用”。

另一种方法来做到这一点,

HttpRequestBase hrb = new HttpGet(req.getUrl()); // should be your URL    
UsernamePasswordCredentials Credential= new UsernamePasswordCredentials("id", "password");
Header header = new BasicScheme(StandardCharsets.UTF_8).authenticate(Credential, hrb, null);
hrb.addHeader(header);