2011-01-07 31 views
22

Tengo que descargar y analizar archivos XML del servidor http con Autenticación HTTP básica. Ahora estoy haciendo de esta manera:Solicitudes HTTP con autenticación básica

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

Pero de esta manera no puedo conseguir XML (o me no simplemente consciente de ello) documento del servidor con la autenticación HTTP.

Estaré muy agradecido si me puede mostrar la mejor y más fácil manera de alcanzar mi objetivo.

Respuesta

56

Puede usar un Authenticator. Por ejemplo:

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

Esto define el valor predeterminado Authenticator y se utilizará en todos los solicitudes. Obviamente, la configuración está más involucrada cuando no necesita credenciales para todas las solicitudes o una cantidad de credenciales diferentes, tal vez en diferentes hilos.

Como alternativa se puede utilizar un DefaultHttpClient cuando una solicitud GET con la autenticación HTTP básica tendría un aspecto similar a:

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

recomiendo el uso de este último porque le da mucho más control (por ejemplo, método, los encabezados, los tiempos de espera , etc.) sobre su solicitud.

+0

Ahora, que estoy recibiendo el error no válido JSON código 107. He comprobado mi json en json lint es apropiado. Entonces, ¿cómo deshacerse de este error? gracias –

+0

¡Lo tengo compañero! estaba haciendo una solicitud POST, tenía que hacer OBTENER. –

2

Usar HttpClient. La documentación para realizar descargas con HTTP AUTH es here. La documentación para obtener un resultado de cadena es here. Luego, analiza la cadena (idealmente usando SAX, no DOM).

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

Prefiero esta variante ya que no depende de la API externa y es específica para la consulta. –

2
  • DefaultHttpClient obsoleta
  • addHeader debe tener 2 parámetros

bloque de código actualizado utilizando 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(); 
+0

El método de autenticación de BasicScheme ha quedado obsoleto –

Cuestiones relacionadas