Avatar billede speedpete Nybegynder
07. marts 2011 - 12:59 Der er 3 kommentarer og
1 løsning

Android XML over https

Jeg får SAXParseException "Unexpected end of Document" ... præcis hver ANDEN gang i denne kode:

URL url = new URL((String)getResources().getText(R.string.operational_status_xml));
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
InputSource is = new InputSource(url.openStream());
Document doc = db.parse(is);
doc.getDocumentElement().normalize();       

Dvs koden kører hver gang Activity'en starter, og det er som sagt hver anden gang, at den går ned. Jeg kan se i debuggeren, at den hopper fra ved Document doc = db.parse(is);

Det er kun, når url er en "https://...", at der er problemer?
Avatar billede arne_v Ekspert
07. marts 2011 - 22:50 #1
Det er godt nok ikke meget at gaa efter.

To ideer (laes: skud i taagen):

1) proev at hent med HttpClient fremfor URL

2) proev med:

        SSLContext sslctx = SSLContext.getInstance("SSL");
        sslctx.init(null, new X509TrustManager[] { new MyTrustManager() }, null);
        HttpsURLConnection.setDefaultSSLSocketFactory(sslctx.getSocketFactory());

og

class MyTrustManager implements X509TrustManager
{
    public void checkClientTrusted(X509Certificate[] chain, String authType) {
    }
    public void checkServerTrusted(X509Certificate[] chain, String authType) {
    }
    public X509Certificate[] getAcceptedIssuers() {
        return new X509Certificate[0];
    }
}
Avatar billede speedpete Nybegynder
08. marts 2011 - 08:24 #2
Det første virker, ihvertfald på android 2.2. I 1.6 får jeg en ssl fejl

HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet();
request.setURI(new URI((String)getResources().getText(R.string.operational_status_xml)));
HttpResponse response = client.execute(request);
BufferedReader in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
InputSource is = new InputSource(in);
Document doc = db.parse(is);   
in.close();
Avatar billede speedpete Nybegynder
08. marts 2011 - 11:36 #3
Ja, det ser ud til at ovennævnte virker i Android 2.2, men ikke 2.1 og nedefter, så jeg ville prøve med HttpsURLConnection og X509TrustManager.

Men hvad gør man? Skal man ikke have lavet en inputstream af en slags ud af HttpsURLConnection?

Jeg kan ikke google mig frem til noget, så hvordan kommer jeg videre fra

SSLContext sslctx = SSLContext.getInstance("SSL");
sslctx.init(null, new X509TrustManager[] { new MyTrustManager() }, null);
HttpsURLConnection.setDefaultSSLSocketFactory(sslctx.getSocketFactory());

til at åbne https://myhost/status.xml

?
Avatar billede speedpete Nybegynder
22. marts 2011 - 11:33 #4
Tråden er vist gået i stå. Lukker
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester