Android Daten von Webseite runterladen, die mit HTTP-Authentifizierung gesichert ist

L30N

Mitglied
Ich arbeite an einer Stundenplan-App für meine Schule. Die App ist fast fertig, das einzige, was fehlt, ist das Login und Herunterladen der Daten von der Webseite:

https://vertretung.fps-niebuell.de/cgi-bin/klasse.cgi?ziel=heute&klasse=5a.htm

Meine Frage ist also: Wie kann ich meine App so programmieren, dass sie Daten von dieser Webseite herunterlädt, für die ein Login erforderlich ist?

Java:
public class DownloadTask extends AsyncTask<String, Void, String> {

    @Override
    protected String doInBackground(String... urls) {
        String result = "";
        URL url;
        HttpURLConnection httpURLConnection;

        try {
            url = new URL(urls[0]);

            httpURLConnection = (HttpURLConnection) url.openConnection();
            httpURLConnection.setRequestProperty("Authorization", "Basic " +
                    Arrays.toString(Base64.encode("username:password".getBytes(), Base64.NO_WRAP)));

            InputStream inputStream = httpURLConnection.getInputStream();
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream);

            int data = inputStreamReader.read();

            while (data != -1) {

                char current = (char) data;

                result += current;

                data = inputStreamReader.read();
            }

            return result;

        } catch (MalformedURLException e) {
            e.printStackTrace();
            return "failed";
        } catch (Exception e) {
            e.printStackTrace();
            return "failed";
        }

    }
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    DownloadTask task = new DownloadTask();
    String result = null;

    try {
        result = task.execute("https://vertretung.fps-niebuell.de/cgi-bin/klasse.cgi?ziel=heute&klasse=5a.htm").get();
    } catch (ExecutionException e) {
        e.printStackTrace();
    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }

    Log.i("Info: ", result);

}

Das Log gibt den Fehler aus:

java.io.FileNotFoundException: https://vertretung.fps-niebuell.de/cgi-bin/klasse.cgi?ziel=heute&klasse=5a.htm
com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:251)
 

httpdigest

Top Contributor
Wenn du dir die HTTP Response Header anguckst, die bei einem Response vom Server kommen (z.B. mit den Dev/F12-Tools vom Browser), dann enthält der Response den Header:
Code:
WWW-Authenticate: Digest realm="FPS", nonce="<random nonce>", algorithm=MD5, qop="auth"
Das bedeutet, es ist keine Basic Authentication, sondern eine Digest Authentication und du musst anders antworten bzw. anders deinen Request stellen.
Siehe: https://en.wikipedia.org/wiki/Digest_access_authentication
Du gehst aktuell davon aus, dass es sich um Basic Authentication handelt gemäß https://en.wikipedia.org/wiki/Basic_access_authentication . Das ist hier jedoch nicht der Fall.
 

L30N

Mitglied
Wenn du dir die HTTP Response Header anguckst, die bei einem Response vom Server kommen (z.B. mit den Dev/F12-Tools vom Browser), dann enthält der Response den Header:
Code:
WWW-Authenticate: Digest realm="FPS", nonce="<random nonce>", algorithm=MD5, qop="auth"
Das bedeutet, es ist keine Basic Authentication, sondern eine Digest Authentication und du musst anders antworten bzw. anders deinen Request stellen.
Siehe: https://en.wikipedia.org/wiki/Digest_access_authentication
Du gehst aktuell davon aus, dass es sich um Basic Authentication handelt gemäß https://en.wikipedia.org/wiki/Basic_access_authentication . Das ist hier jedoch nicht der Fall.

Vielen Dank für die schnelle Antwort.
Mit meinen Aktuellen Kenntnissen scheint es für mich praktisch unmöglich zu sein sowas selber zu entwickeln und mit den Beispielen bei Google komme ich nicht weiter. Wenn es noch welche Tipps gibt, gerne her damit. :D

LG
 

L30N

Mitglied
Wenn du dir die HTTP Response Header anguckst, die bei einem Response vom Server kommen (z.B. mit den Dev/F12-Tools vom Browser), dann enthält der Response den Header:
Code:
WWW-Authenticate: Digest realm="FPS", nonce="<random nonce>", algorithm=MD5, qop="auth"
Das bedeutet, es ist keine Basic Authentication, sondern eine Digest Authentication und du musst anders antworten bzw. anders deinen Request stellen.
Siehe: https://en.wikipedia.org/wiki/Digest_access_authentication
Du gehst aktuell davon aus, dass es sich um Basic Authentication handelt gemäß https://en.wikipedia.org/wiki/Basic_access_authentication . Das ist hier jedoch nicht der Fall.

Okay. Ich bin schon mal weiter als vorher. Es gibt nun aber ein neues Problem. Und zwar wird folgender ,,Fehler" heruntergeladen:

Unauthorized
This server could not verify that youare authorized to access the documentrequested. Either you supplied the wrongcredentials (e.g., bad password), or yourbrowser doesn't understand how to supplythe credentials required.

Apache/2.4.7 (Ubuntu) Server at vertretung.fps-niebuell.de Port 443
 

L30N

Mitglied
Dann führst du anscheinend nicht die richtigen Schritte aus, um dich zu authentisieren, wie eben in https://en.wikipedia.org/wiki/Digest_access_authentication beschrieben. Mehr kann man ohne jegliche Informationen, was du denn jetzt genau tust bzw. getan hast, nicht sagen.

Java:
    class AsyncTask extends android.os.AsyncTask<String, Void, String> {

        @Override
        protected String doInBackground(String... strings) {

            String username = strings[0];
            String password = strings[1];
            String url = strings[2];

                Log.i("INFO", "HtmlDownloadService started");
                HttpGet getRequest = null;
                try {
                    DefaultHttpClient httpclient = new DefaultHttpClient();
                    httpclient.getParams().setParameter("http.protocol.content-charset", "iso-8859-1");
                    httpclient.getCredentialsProvider().setCredentials(new AuthScope("vertretung.fps-niebuell.de", 80), new UsernamePasswordCredentials(username, password));
                    HttpGet getRequest2 = new HttpGet(url);
                    Log.i("INFO", "Try 1");
                    try {
                        HttpResponse response = httpclient.execute(getRequest2);
                        if (response.getStatusLine().getStatusCode() != 200) {
                            getRequest = getRequest2;
                        }
                        entity = response.getEntity();
                        if (entity != null) {
                            inputStream = null;
                            inputStream = entity.getContent();
                            BufferedReader r = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.ISO_8859_1));
                            StringBuilder total = new StringBuilder();
                            while (true) {
                                String line = r.readLine();
                                if (line == null) {
                                    break;
                                }
                                total.append(line);
                            }
                            htmlCode = total.toString();
                            if (inputStream != null) {
                                inputStream.close();
                            }
                            entity.consumeContent();
                            getRequest = getRequest2;
                            Log.i("INFO", "Try 2");
                            Log.i("INFO", htmlCode);
                        }
                    } catch (Exception e2) {
                        e = e2;
                        getRequest = getRequest2;
                        getRequest.abort();
                        Log.i("HtmlDownloader: ", "Something went wrong while retrieving Source code from " + username + e.toString());
                        htmlCode = "Error 400";
                        Log.i("INFO", "Catch 1");
                    } catch (Throwable th) {
                        if (inputStream != null) {
                            inputStream.close();
                        }
                        entity.consumeContent();
                        Log.i("INFO", "Catch 2");
                    }
                } catch (Exception e3) {
                    e = e3;
                    getRequest.abort();
                    Log.i("HtmlDownloader: ", "Something went wrong while retrieving Source code from " + username + e.toString());
                    htmlCode = "Error 400";
                    Log.i("INFO", "Catch 3");
                }
            return htmlCode;
            }
        }

Das ist mein bisheriger Code.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Firebase RealtimeDatabase - Daten aus Queries in CSV File speichern Android & Cross-Platform Mobile Apps 1
N XY-Plottet keine Daten obwohl Funktion ausgeführt wird Android & Cross-Platform Mobile Apps 4
N XY-Plot plottet keine Daten Android & Cross-Platform Mobile Apps 0
W Background Service Daten verarbeiten/Schleife ect. Android & Cross-Platform Mobile Apps 1
R Android Daten speichern und anzeigen Android & Cross-Platform Mobile Apps 7
MiMa Daten vom Brustgurt bekommen? Android & Cross-Platform Mobile Apps 3
ruutaiokwu Android Daten von "Activity A" nach "Activity B" umleiten? Android & Cross-Platform Mobile Apps 13
P Daten bzw Objekte auf das Handy lokal speichern Android & Cross-Platform Mobile Apps 29
W Android Browser startet immer, bevor die Daten dafür geholt wurden Android & Cross-Platform Mobile Apps 15
J Android Server-Login Daten in der App sicherer hinterlegen? Android & Cross-Platform Mobile Apps 7
T Firestore Daten in Spinner Android & Cross-Platform Mobile Apps 0
B Accelerometer daten umwandeln Android & Cross-Platform Mobile Apps 41
S Android Apk Daten auslesen Android & Cross-Platform Mobile Apps 6
G Android Daten in einer Datenbank speichern Android & Cross-Platform Mobile Apps 1
ATZENPOWER Android Probleme mit mobilen Daten via lte Android & Cross-Platform Mobile Apps 10
S Android Studio MySql Daten in Listview mit sub Item Android & Cross-Platform Mobile Apps 11
A Android Daten in der Cloud speichern (Google) Android & Cross-Platform Mobile Apps 1
K Unbekannte Menge von Daten (Strings oder Ints) an Activity übergeben Android & Cross-Platform Mobile Apps 0
K Android SQLite Query "WHERE _id in (X, Y, Z)" keine Daten Android & Cross-Platform Mobile Apps 6
M Anzeigen der Daten dauert zu lange - Progressdialog? Android & Cross-Platform Mobile Apps 5
K Android DialogFragment mit SimpleCursorAdapter: Auf Daten zugreifen? Android & Cross-Platform Mobile Apps 4
S Daten aus Android Gerät auslesen Android & Cross-Platform Mobile Apps 3
L Android Datei erstellen, Daten einspeichern und auslesen Android & Cross-Platform Mobile Apps 2
B Alle Daten gehen verloren, wenn die Displaysperre aktiviert wird? Android & Cross-Platform Mobile Apps 21
M Daten zwischen mehreren Activities Android & Cross-Platform Mobile Apps 2
M Daten zwischen Activities übergeben Android & Cross-Platform Mobile Apps 7
G Daten von einer Activity zur nächsten übergeben Android & Cross-Platform Mobile Apps 6
G Wie gebe ich dem DrawView die Daten mit? Android & Cross-Platform Mobile Apps 2
V App Daten in Java Applikation Android & Cross-Platform Mobile Apps 3
D Android Daten verwalten Android & Cross-Platform Mobile Apps 2
S Android binäre Daten zwischen Android und einem Java-Server Android & Cross-Platform Mobile Apps 5
M Android Von Smartphone auf Daten von Server zugreifen Android & Cross-Platform Mobile Apps 2
C Android Listen/Daten aus der SQLLite Datenbank darstellen Android & Cross-Platform Mobile Apps 2
L Android Einlesen und rausschreiben von Daten auf SD Android & Cross-Platform Mobile Apps 3
U Android Daten dauerhaft speichern? Android & Cross-Platform Mobile Apps 2
P Java ME benutzer daten speichern Android & Cross-Platform Mobile Apps 5
7 GPS-Daten auslesen auf Samsung SGH I900 Omnia Android & Cross-Platform Mobile Apps 3
X RMS - Will die Daten auf den PC kopieren Android & Cross-Platform Mobile Apps 3
B Daten in *.txt schreiben Android & Cross-Platform Mobile Apps 7
R Lesen und schreiben von Daten. Android & Cross-Platform Mobile Apps 2
K XDA Orbit: Auslesen der GPS Daten mit J2ME Android & Cross-Platform Mobile Apps 2
M Daten aus Jad-file auslesen Android & Cross-Platform Mobile Apps 2
O eingehende Daten speichern Android & Cross-Platform Mobile Apps 2
M Suche eine Webseite mit dem aktuelle Datum in XML Android & Cross-Platform Mobile Apps 18
W JAVA2ME-Game von Handy (V300) auf Pc runterladen?? Android & Cross-Platform Mobile Apps 4

Ähnliche Java Themen

Neue Themen


Oben