2012-05-07 5 views
13

Ich verwende Java, um auf eine HTTPS-Site zuzugreifen, die die Anzeige in einem XML-Format zurückgibt. Ich gebe die Anmeldedaten in der URL selbst weiter. Hier ist der Code-Schnipsel:Server hat HTTP-Antwortcode zurückgegeben: 401 für URL: https

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
DocumentBuilder db = dbf.newDocumentBuilder(); 
requestURL = "https://Administrator:[email protected]:8443/abcd"; 

try { 
     InputStream is = null; 
     URL url = new URL(requestURL); 
     InputStream xmlInputStream =new URL(requestURL).openConnection().getInputStream(); 
     byte[] testByteArr = new byte[xmlInputStream.available()]; 
     xmlInputStream.read(testByteArr); 
     System.out.println(new String(testByteArr)); 
     Document doc = db.parse(xmlInputStream); 
     System.out.println("DOC="+doc); 
    } catch (MalformedURLException e) { 
    } 

Ich bin ein Trust-Manager in das Programm schaffen, das lässt sich aber nicht mit/ohne Vorzeichen Zertifikate. Aber beim Ausführen des obigen Programms bekomme ich den Fehler Server zurückgegeben HTTP-Antwortcode: 401 für URL: https://Administrator:[email protected]:8443/abcd

Ich kann die gleiche URL in meinem Browser verwenden und es zeigt die XML richtig. Bitte lassen Sie mich wissen, wie dies im Java-Programm funktioniert.

Antwort

24

401 bedeutet "nicht autorisiert", also muss es etwas mit Ihren Anmeldeinformationen geben.

Ich denke, dass Java URL die Syntax, die Sie zeigen, nicht unterstützt. Sie könnten stattdessen einen Authentifikator verwenden.

Authenticator.setDefault(new Authenticator() { 

    @Override 
    protected PasswordAuthentication getPasswordAuthentication() {   
     return new PasswordAuthentication(login, password.toCharArray()); 
    } 
}); 

und dann einfach aufrufen die normale URL, ohne die Anmeldeinformationen.

Die andere Option ist die Anmeldeinformationen in einem Header zur Verfügung zu stellen:

String loginPassword = login+ ":" + password; 
String encoded = new sun.misc.BASE64Encoder().encode (loginPassword.getBytes()); 
URLConnection conn = url.openConnection(); 
conn.setRequestProperty ("Authorization", "Basic " + encoded); 

PS: Es ist nicht so Base64Encoder verwenden empfohlen, aber dies ist nur eine schnelle Lösung zu zeigen. Wenn Sie diese Lösung beibehalten möchten, suchen Sie nach einer entsprechenden Bibliothek. Es gibt viele.

+1

Dank Guillaume Polet. Die zweite Option funktionierte wie ein Charme. Ich brauche es nur für interne Tests, also denke ich, dass das reichen könnte. – Vish

+1

danke Polet. Die zweite Option hat mir geholfen. –

1

Versuchen Sie dies. Sie müssen die Authentifizierung übergeben, damit der Server seinen gültigen Benutzer kennt. Sie müssen diese beiden Pakete importieren und müssen ein Jersy-Jar enthalten. Wenn Sie nicht wollen, jersy jar enthalten importieren Sie dann dieses Paket

import sun.misc.BASE64Encoder; 

import com.sun.jersey.core.util.Base64; 
import sun.net.www.protocol.http.HttpURLConnection; 

und dann

String encodedAuthorizedUser = getAuthantication("username", "password"); 
URL url = new URL("Your Valid Jira URL"); 
HttpURLConnection httpCon = (HttpURLConnection) url.openConnection(); 
httpCon.setRequestProperty ("Authorization", "Basic " + encodedAuthorizedUser); 

public String getAuthantication(String username, String password) { 
    String auth = new String(Base64.encode(username + ":" + password)); 
    return auth; 
}