1. Nimm jetzt an unserem 2. ADVENT-Gewinnspiel teil - Alle Informationen findest Du hier!

Beste Lösung: Senden, empfangen und analysieren von webserverdaten

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von dev4all, 05.08.2010.

  1. dev4all, 05.08.2010 #1
    dev4all

    dev4all Threadstarter Neuer Benutzer

    Beiträge:
    6
    Erhaltene Danke:
    0
    Registriert seit:
    05.08.2010
    Hallo Mitglieder,

    Dies ist mein erster Beitrag hier und ich brauche eure Hilfe.
    Ich möchte ein Android App schreiben.
    Mich interessiert Fussball.
    In Bayern haben wir ein Fußball-Ergebnis-System vom BFV (Bayerischer Fußball-Verband).

    siehe diesen Link
    Ergebnisse

    Meine Idee ist nun ein App für Android zu schreiben.

    Ich habe die Webseite analysiert.
    1. in Form "Suche nach Ligen" (Search Ligen) können Bezirke, Kreise und Ligen ausgewählt werden
    In verschiedenen Bezirken gibt unterschiedliche Kreise und Ligen. Wenn nun der Bezirk ausgwählt wird werden die weiteren Auswahlmöglichkeiten für Kreis und Ligen dynamisch erstellt.
    Dies wird durch die Funktion ChangeBezirk (bezirkId) in selectboxes.js getan

    2. Drückt man nun den Button "Suche starten" starten Sie die Funktion "javascript: submitIt ('combine')"

    Die Funktion submitIt baut eine URL aus den verschiedenen Einträgen im Eingabeformular (mit Hilfe von function GET-Parameter) zusammen und sendet diese mit Hilfe der 2 Zeilen
    document.formLigaPublicErgebnisse.action url =;
    document.formLigaPublicErgebnisse.submit ();
    zum Webserver.

    Ein Beispiel für die erstellet URL:
    "http://ergebnisse.bfv.de/cms/seiten/ligaPublicErgebnisse.do?reqCode=save&vereinsname=&bezirk_id=99&kreis_id=0&spielklasse_id=0&altersklasse_id=10&geschlecht_id=1&spieltyp_id=1&filterType=combine"


    Code:
    function submitIt(filterType) { 
    // Bei der Suche nach Vereinen muss ein Suchkriterium angegeben sein
    var vereineSearchOk = false;
    var suchfeldVerein = document.formLigaPublicErgebnisse.vereinsname.value;
    suchfeldVerein = trim(suchfeldVerein);
    if (suchfeldVerein.length != '' && suchfeldVerein.length > 0) {
    vereineSearchOk = true;
    }        
    if (filterType != 'vereine' || vereineSearchOk) {
    var url = 'ligaPublicErgebnisse.do?reqCode=save';
    url += getParameter();
    url += '&filterType=' + filterType;
    document.formLigaPublicErgebnisse.action = url;
    document.formLigaPublicErgebnisse.submit();
    }
    }
    function showTab(tab) {
    var url = 'ligaPublicErgebnisse.do?reqCode=edit&showErgebnisse=1&liga_id=0';
    url += getParameter();
    url += '&filterType=combine&tab=' + tab + '#tabanker';
    document.formLigaPublicErgebnisse.action = url;
    document.formLigaPublicErgebnisse.submit();
    }
    function getParameter() {
    var url = '';
    // Die Filtereinstellungen in der URL setzen, damit der User die URL bookmarken kann
    url += "&vereinsname=" + document.formLigaPublicErgebnisse.vereinsname.value;
    url += "&bezirk_id=" + document.formLigaPublicErgebnisse.bezirk_id.value;
    url += "&kreis_id=" + document.formLigaPublicErgebnisse.kreis_id.value;
    url += "&spielklasse_id=" + document.formLigaPublicErgebnisse.spielklasse_id.value;
    url += "&altersklasse_id=" + document.formLigaPublicErgebnisse.altersklasse_id.value;
    url += "&geschlecht_id=" + document.formLigaPublicErgebnisse.geschlecht_id.value;
    url += "&spieltyp_id=" + document.formLigaPublicErgebnisse.spieltyp_id.value;
    return url;
    }
    Nach dem Absenden der Anfrage erhalten ich das Ergebnis in der Tabelle "Ligaliste"


    Nach der Analyse der Seite habe ich versucht ein App zu schreiben.
    Ich sende zuerst die generierte URL an den Server und durchsuche den Quellcode nach dem Titel "iVerein finden myString.indexOf = (" <title> ");"

    Code:
    public class GetDataFromTheWeb extends Activity {
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle icicle) {
            super.onCreate(icicle);
    
            /* We will show the data we read in a TextView. */
            TextView tv = new TextView(this);
            
            /* Will be filled and displayed later. */
            String myString = null;
            Integer iVerein = 0;
            String sVerein = null;
            //String Verein = "Verein";
            try {
                /* Define the URL we want to load data from. */
                URL myURL = new URL(
                    "http://www.bfv.de/cms/seiten/ligaPublicErgebnisse.do?reqCode=edit&showErgebnisse=1&liga_id=38775&vereinsname=tsv%20brunn&bezirk_id=4&kreis_id=0&spielklasse_id=0&altersklasse_id=10&geschlecht_id=1&spieltyp_id=2&filterType=vereine&tab=2#tabanker");
                /* Open a connection to that URL. */
                URLConnection ucon = myURL.openConnection();
    
                /* Define InputStreams to read 
                 * from the URLConnection. */
                InputStream is = ucon.getInputStream();
                BufferedInputStream bis = new BufferedInputStream(is);
                
                /* Read bytes to the Buffer until 
                 * there is nothing more to read(-1). */
                ByteArrayBuffer baf = new ByteArrayBuffer(50);
                int current = 0;
                while((current = bis.read()) != -1){
                    baf.append((byte)current);
                }
    
                /* Convert the Bytes read to a String. */
                myString = new String(baf.toByteArray());
                //iVerein = new String((myString.indexOf("<title>"))());
                iVerein = myString.indexOf("<title>");
                sVerein = iVerein.toString();
                myString = myString.substring(iVerein+7,iVerein+17);
            } catch (Exception e) {
                /* On any Error we want to display it. */
                myString = e.getMessage();
                
            }
            
            /* Show the String on the GUI. */
            tv.setText(myString);
            //tv.setText(sVerein);
            this.setContentView(tv);
        }
    }
    Jetzt bin ich an einem Punkt angekommen wo ich nicht mehr weiß wie ich mein Project weiterführen kann.

    Ich habe viele Fragen.
    1. Ist der beste Weg das Ergebnis der Anfrage über den Quellcode zu analysieren? Meiner Meinung Nein. Es muss eine bessere Lösung geben.
    2. Ich weiß nicht wie die Suchergebnisse mit dem 2-Befehl erzeugt wird?
    document.formLigaPublicErgebnisse.action url =;
    document.formLigaPublicErgebnisse.submit ();
    Können ihr mir helfen?

    3. Ist formLigaPublicErgebnisse eine Art von Klasse und wo ist formLigaPublicErgebnisse gespeichert?
    4. Ist es möglich den Zugriff auf die Funktionen direkt zu bekommen? Ist ja in JavaScript geschrieben.
    5. Was ist ligaPublicErgebnisse.do? Wo ist die Funktion auf dem Webserver gespeichert?

    Ich denke, der beste Weg wäre folgender.
    1. Es ist eine Datenbank mit allen erforderlichen Daten auf dem Webserver vorhanden.
    2. Zugriff auf die Datenbank direkt über JavaScript-Funktionen in Android Apps.
    3. Antworten,Ergebnisse in Android App weiterverarbeiten?
    Welcher Meinung seit ihr?

    Danke für eure Hilfe!
    Gruß
    dev4all
     
  2. MichaelS, 06.08.2010 #2
    MichaelS

    MichaelS Fortgeschrittenes Mitglied

    Beiträge:
    370
    Erhaltene Danke:
    51
    Registriert seit:
    14.08.2009
    Du wirst niemals direkten zugriff auf die Datenbanken bekommen ;) Ansich ist der Ansatz garnicht sooo falsch ;) Wie bereits von dir erwähnt, ist in dem fall das crawln (sourcecode scannen) der einzige weg. Du solltest die richtigen http urls rausfinden und ein einfachen request senden und diese antwort kannst du ziemlich leicht mit Regex Parsen =) Ist nicht sehr kompliziert. Wenn de das getan hast, solltest du threading einbauen... sprich request ins web können mal ne weile dauern und deine app sollte ja nicht stehen bleiben =) Also das "Request senden -> Antwort bekommen -> Source parsen" in ein Thread auslagern... ist der Thread fertig, schickst du ein delegate in deine app, damit diese die Daten nun aktualisieren kann. Fertig =)
     
  3. manu, 06.08.2010 #3
    manu

    manu Fortgeschrittenes Mitglied

    Beiträge:
    329
    Erhaltene Danke:
    25
    Registriert seit:
    29.03.2009
    Phone:
    Galaxy Nexus
    Ganz nebenbei: Bitte vorher abklären, ob du dazu berechtigt bist.
    Man darf nämlich nicht die Daten einer Website auslesen und in der eigenen App wieder bereitstellen.

    Gruß Manu
     
  4. dev4all, 07.08.2010 #4
    dev4all

    dev4all Threadstarter Neuer Benutzer

    Beiträge:
    6
    Erhaltene Danke:
    0
    Registriert seit:
    05.08.2010
    Hallo Leute,

    danke für eure Antworten.

    @MichaelS
    Du schreibst ich soll die richtigen urls herausfinden. Dies wird aber gar nicht so einfach da ja die url dynamisch erstellt wird. Dabei werden die Bezirke, Kreise und Ligen in Nummer umgesetzt
    (bezirk_id=99&kreis_id=0&spielklasse_id=0&alterskla sse_id=10&geschlecht_id=1&spieltyp_id=1&filterType =combine")
    Ich muss also zunächst alle möglichen Zuordnungen kennen. Nur dann kann ich die url bilden.
    Hast du dazu eine Idee?

    Was ist genau ist Regex Parsen? Kann du mir ein Beispiel nennen?

    Kann ich nicht einfach externe Javascript verwenden?

    Es gibt vom BFV auch ein anderes Widget mit dem man die aktuelle Tabelle in die eigene Homepage einbinden kann. Hier wird auch eine externe Funktion verwendet: tmwrWidgetFunctions.js

    Code:
    <script type="text/javascript" src="http://ergebnisse.bfv.de/javascript/widgets/tmwrWidgetFunctions.js">
    </script>
    <p>
    &nbsp;
    </p>
    <p>
    &nbsp;
    </p>
    <center><b>Tabelle und Ergebnisse 1.Mannschaft</b> 
    <p>
    &nbsp;
    
    </p>
    <p>
    &nbsp;
    </p>
    <div id="meineLiga_1">
    ... lade Liga ... 
    </div>
    <script type="text/javascript">
    var liga = new BFVLigaWidget();
    liga.setzeLigaNr('2221041012');
    liga.setzeVereinNr('4236');
    liga.zeigeErgebnisse('meineLiga_1');</script>
    <p>
    &nbsp;
    </p>
    @manu:
    Danke für den Hinweis. Ich will ja erste einmal generell ausprobieren wie ob dies funktionieren könnte

    Gruß
    dev4all
     
  5. Artwork, 07.08.2010 #5
    Artwork

    Artwork Android-Hilfe.de Mitglied

    Beiträge:
    84
    Erhaltene Danke:
    8
    Registriert seit:
    29.07.2010
    Phone:
    T-Mobile G1
    warum machst du dir das so schwer. eigentlich ist es ganz simpel. soweit ich das verstanden habe ist das deine Webseite.

    Wie du richtig sagtest, ein direkter zugriff auf Datenbanken im web ist nicht sinvoll. Deshalb holt man sich die nötigen Daten für die App von einer Webseite über einen Get/Post Request.

    Dafür brauchst du eine art API, eig REST API welche dir Daten liefern kann. Dies ist nichts anderes als ein Skript/eine URL deiner Webseite die dann aber kein layout/ keine darstellung wiedergibt sondern nur Daten in einer bestimmten Form, z.B. Xml oder Json.

    Ich weiß nicht wie deine Verzeichnisstruktur in deinem Projekt ist. Aber sagen wir mal du willst alle FBVereine einfach nur auflisten. Das ist ein einfacher Get Request. Du schreibst z.B. ein PHP Skript und legst es ab in www.meineseite.de/rest/getAllClubs.php

    In getAllClubs.php werden die Daten aus der DB ausgelesen und in eine Form gebracht, ich nehme immer JSON. In Php gibt es bequeme Methoden wie man JSON aus einem Array von DB Daten erzeugen kann und in Java wie man aus Json wieder ein Datenarray bekommt, etwa so

    Code:
    JSONArray jArray = new JSONArray(json)
    jArray lässt sich durchlaufen und mit
    Code:
    getJSONObject(stelle)
    jedes Objekt auslesen. Aber wie du das machst ist rein deine Sache.

    So und in Android ist eine allgemeine Lösung diese:

    Code:
    String url = "www.meineseite.de/rest/" + deineaktion
    String result = "";
    DefaultHttpClient client = new DefaultHttpClient();
    HttpGet method = new HttpGet(url);
    HttpResponse res = null;
    try {
    	res = client.execute(method);
    } catch (ClientProtocolException e1) {
    	// TODO Auto-generated catch block
    	e1.printStackTrace();
    } catch (IOException e1) {
    	// TODO Auto-generated catch block
    	e1.printStackTrace();
    }
    
    über den InputStream kommst du dan die Daten :

    Code:
    
    try{
    	InputStream is = res.getEntity().getContent();
    	BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"));
    	StringBuilder sb = new StringBuilder();
    	String line = null;
    	while ((line = reader.readLine()) != null) {
    		   sb.append(line + "\n");
    	}
    	s.close();
    	result = sb.toString();
    	}catch(Exception e){
    	       Log.e("log_tag", "Error converting result "+e.toString());
    	}
    
    result hälst dann deine daten;)
    hoffe konnte dir helfen

    ps: http://www.helloandroid.com/tutorials/connecting-mysql-database
     
    Zuletzt bearbeitet: 07.08.2010
  6. dev4all, 08.08.2010 #6
    dev4all

    dev4all Threadstarter Neuer Benutzer

    Beiträge:
    6
    Erhaltene Danke:
    0
    Registriert seit:
    05.08.2010
    Hallo Artwork,

    danke für deine Antwort. Die Webseite vom BFV ist nicht meine eigene. Das zusätzliche BFV Widget ist aber auf meiner Seite.

    Deine Idee, dass ich auf meine Webseite eine php-Datei legen soll die automatisiert die Daten von der BFV Seite holt gefällt mir. Ich brauche mit meinem App dann nur noch auf meine Seite zugreifen. Was dagegen spricht ist aber die Aktualität der Daten. Ich habe dann aber keinen "Live" Betrieb.

    Mir würde die Idee besser gefallen die Daten aus der BFV Seite direkt aus dem App abzufragen. Hier bin ich mir aber nicht sicher ob dies funktionieren kann. Wenn ich alle möglichen Daten aus der BFV Page Abfrage und diese dann in meiner App in einem Array speichere dauert dies vermutlich ziemlich lange. Ich muss mir noch genau überlegen welche Daten ich benötige.
    Aktuell drehe ich mich irgendwie im Kreis. Da ich nur Erfahrung in C/C++ habe muss ich erst einmal meine Hausaufgaben machen.

    Das einfachste wäre den Admin der BFV Page zu kontaktieren und mir die Möglichkeiten der Zugriffe aufzeigen zu lassen. Ich vermute aber, das ich diese Infos nicht bekommen werde. :(

    Vielleicht hat jemand noch eine andere Idee.

    Ich denke das Parsen wird auch nicht ganz einfach, da ich ja die richtigen Stellen im Quelltext finden muss. Hier weiß ich auch noch nicht wie ich genau an die richtigen Stellen springen kann. Gibt es hierfür eine einfache Lösung?
     
  7. Artwork, 08.08.2010 #7
    Artwork

    Artwork Android-Hilfe.de Mitglied

    Beiträge:
    84
    Erhaltene Danke:
    8
    Registriert seit:
    29.07.2010
    Phone:
    T-Mobile G1
    phuu, ja dann musst du die daten irgendwie extrahieren. ich würde keine direkten anfragen an die fremde webseite machen, vor allem in puncto performance und verlässligkeit, aber auch im sinne einer gute modellierung ist das nicht empfohlen.

    es ist möglich mit python webseiten zu crawlen und daten zu extrahieren anhand eines selbst definierten pattern, stichwort scrapy.

    Projekt: Scrapy | An open source web scraping framework for Python
    Tutorial: link

    Ich hab selbst schon damit erfolgreich gearbeitet. Ich habe ein python Skript welches einmal täglich automatisiert ausgeführt wird, und Daten extrahiert und in meine Datenbank schreibt. Wenn du möchtest kann ich dir gerne ein Beispielskript posten.
     
  8. dev4all, 08.08.2010 #8
    dev4all

    dev4all Threadstarter Neuer Benutzer

    Beiträge:
    6
    Erhaltene Danke:
    0
    Registriert seit:
    05.08.2010
    OK,

    du kannst gerne das Script posten.

    Du schreibst, dass das Script einmal täglich ausgeführt wird. Damit hast du aber keine Realtimedaten.

    So wie ich es sehe gibt es drei Möglichkeiten:
    1. Auf eigenen Webspace php script legen, dass die Daten von der BFV Page abfrägt. Mit App auf die aufbereiteten Daten auf der eigenen Page zugreifen.

    2. Den Quelltext der BFV Page analysieren und dann verarbeiten

    3. Auf der BFV Page eine API hinterlegen (auch PHP Script) mit der direkt die Datenbanken durchsucht werden können. (gefällt mir persönlich am Besten, wird aber am Schwierigsten zum Umsetzen)
     
  9. Artwork, 08.08.2010 #9
    Artwork

    Artwork Android-Hilfe.de Mitglied

    Beiträge:
    84
    Erhaltene Danke:
    8
    Registriert seit:
    29.07.2010
    Phone:
    T-Mobile G1
    ich weiß nicht wie aktuell die daten sein müssen, aber du kannst das skript natürlich beliebig ausführen.

    Die 3te Möglichkeit ist ja, am elegantesten. du kannst das auch auf deinem server ausführen. müsstest die daten von der anderen seite, dann in realtime!, crawlen. Das ist natürlich auch mit php möglich.

    PHPCrawl - Webcrawler Class

    Eine Anfrage über deine App produziert dann aber einmal einen request an deine webseite, welche dann wiederum einen request an eine andere seite schickt. Da muss natürlich einiges an daten verarbeitet werden, aber sollte kein problem sein^^
     
  10. becks90, 06.11.2010 #10
    becks90

    becks90 Neuer Benutzer

    Beiträge:
    1
    Erhaltene Danke:
    0
    Registriert seit:
    05.11.2010
    Wäre auch sehr interessiert an diesem App. Eventuell kannst du dir ja ein bischen was von dem iPhone App abschauen, das funktioniert ganz gut und sieht schick aus.
     
  11. djangp, 09.04.2011 #11
    djangp

    djangp Android-Experte

    Beiträge:
    515
    Erhaltene Danke:
    33
    Registriert seit:
    19.03.2011
    Ist in dieser Richtung ein BFV App für Android schon etwas passiert. Das wäre sehr sehr interessant.
     

Diese Seite empfehlen