2011-01-07 14 views
22

Muszę pobrać i przeanalizować pliki XML z serwera http z Podstawowe uwierzytelnianie HTTP. Teraz robię to w ten sposób:Żądania HTTP z podstawowym uwierzytelnianiem

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

Ale w ten sposób nie można uzyskać xml (lub nie jestem po prostu świadomy tego) dokumentu z serwera z uwierzytelniania http.

Będę naprawdę wdzięczny, jeśli możesz pokazać mi najlepszy i najłatwiejszy sposób osiągnięcia mojego celu.

Odpowiedz

56

Można użyć numeru Authenticator. Na przykład:

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

Ustawia domyślną Authenticator i będą wykorzystywane w wszystkich żądań. Oczywiście konfiguracja jest bardziej zaangażowana, gdy nie potrzebujesz poświadczeń dla wszystkich żądań lub wielu różnych poświadczeń, być może w różnych wątkach.

Alternatywnie można użyć DefaultHttpClient gdzie żądanie GET z podstawowego uwierzytelniania HTTP będzie wyglądać podobnie do:

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

Polecam używanie tych ostatnich, ponieważ daje dużo większą kontrolę (np metoda, nagłówki, limity czasu itp.) na twoją prośbę.

+0

Teraz jestem coraz kod błędu 107 json nieprawidłowy. Sprawdziłem, czy mój json na json lint jest prawidłowy. Tak więc, jak pozbyć się tego błędu. dzięki –

+0

Mam partnera! robił żądanie POST, musiał zrobić GET. –

2

Użyj HttpClient. Dokumentacja do pobrania za pomocą protokołu HTTP AUTH to here. Dokumentacja do uzyskania wyniku ciągu to here. Następnie przeanalizuj swój ciąg (najlepiej używając SAX, ale nie 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

Preferuję ten wariant, ponieważ nie zależy on od zewnętrznego interfejsu API i jest specyficzny dla zapytania. –

2
  • DefaultHttpClient przestarzałe
  • AddHeader musi mieć 2 parametry

Updated blok kodu za pomocą 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

Metoda uwierzytelniania z BasicScheme została uznana za przestarzałą –

Powiązane problemy