2011-01-07 9 views
22

Ich muss herunterladen und XML-Dateien von HTTP-Server mit HTTP Basic-Authentifizierung. Jetzt ist es auf diese Weise ich tue:HTTP-Anfragen mit Standardauthentifizierung

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

Aber in dieser Art und Weise kann ich nicht xml bekommen (oder ich bin einfach nicht bewusst, dass) Dokument vom Server mit HTTP-Authentifizierung.

Ich werde wirklich dankbar sein, wenn Sie mir den besten und einfachsten Weg zeigen können, mein Ziel zu erreichen.

Antwort

56

Sie können eine Authenticator verwenden. Zum Beispiel:

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

Dies legt den Standard Authenticator und wird in alle Anfragen verwendet werden. Offensichtlich ist das Setup komplizierter, wenn Sie keine Anmeldeinformationen für alle Anforderungen oder eine Anzahl verschiedener Anmeldeinformationen benötigen, möglicherweise für verschiedene Threads.

Alternativ können Sie DefaultHttpClient verwenden, bei denen eine GET-Anforderung mit einfachen HTTP-Authentifizierung wie folgt aussehen würde:

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

ich letzteres empfehlen, weil es Ihnen viel mehr Kontrolle gibt (zB Verfahren, headers, Timeouts usw.) über Ihre Anfrage.

+0

Jetzt verwenden, ich bin immer Code 107 ungültig json Fehler. Ich habe meine JSON auf Json Flusen geprüft. So, wie man diesen Fehler los wird. Danke –

+0

Bekam es Kumpel! machte eine POST-Anfrage, musste GET tun. –

2

Verwenden Sie HttpClient. Dokumentation zur Durchführung von Downloads mit HTTP AUTH ist here. Dokumentation für das Abrufen eines Zeichenfolge-Ergebnisses ist here. Analysieren Sie dann Ihre Zeichenfolge (idealerweise mit SAX, nicht mit 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

Ich bevorzuge diese Variante, da sie nicht von der externen API abhängt und für die Abfrage spezifisch ist. –

2
  • DefaultHttpClient veraltet
  • addHeader 2 Parameter müssen

Aktualisiert Codeblock 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

Die Methode authenticate from BasicScheme ist veraltet –

Verwandte Themen