Seiten

Java und die Eve API

Da ich vor kurzem ein kleines Projekt gestartet habe, beidem ich über die Eve API Charackter Skills eingelesen habe, will ich euch dies nicht vorenthalten.

Was brauchen ich um in Java mit der Eve API zu kommunizieren?
Java stellt mit seinen Standardt Libs schon alles zur Verfügung, was man braucht um Anfragen an die API-Server zu erstellen und die erhaltene XML-Datei auszulesen.
Folgende Java-Packages werden benötigt:
java.net.URL, org.w3c.dom und javax.xml.parsers

Wie erstelle ich eine Abfrage an den Server?
Hierzu müssen wir erstmal ein Object vom Typ URL erstellen.
In folgendem Beispiel erstellen wir eine URL, die anhand einer keyId und des vCodes den wir zuvor erstellt haben, die Characktere des Accounts anzeigt/zurück gibt:

public class APITest {
    
    public static void main(String args[]) {
        //Die keyId des API-Key
        String keyID = "";
        //Der vCode des API-Keys
        String vCode = "";

        //Hier erzeugen wir ein Object der Klasse java.net.URL
        URL url = new URL("https://api.eveonline.com/" +
            "account/Characters.xml.aspx?keyID=" + keyId 
            + "&vCode=" + vCode);
    }

}
 
Wir haben nun ein Object der Klasse URL, welches wir im nächsten Schritt benutzen um die XML-Datei vom API-Server abzurufen:

public class APITest {
    
    public static void main(String args[]) {
        //Die keyId des API-Key
        String keyID = "";
        //Der vCode des API-Keys
        String vCode = "";

        //Hier erzeugen wir ein Object der Klasse java.net.URL
        URL url = new URL("https://api.eveonline.com/" +
            "account/Characters.xml.aspx?keyID=" + keyId 
            + "&vCode=" + vCode);

        //Vorbereitungen treffen
        DocumentBuilderFactory dbf = 
            DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        
        //Hier erstellen wir ein Document, welches wir nachher
        //nutzen um auf die XML-Elemente zuzugreifen
        Document doc = db.parse(url..openStream());

        doc.getDocumentElement().normalize();

        //Speichern der relevanten Elemente in einer Liste
        NodeList nList = doc.getChildElementsByTagName("rowset");

        for(int i = 0; i < nList.getLength(); i++) {
            Element e = (Element) nList.item(i);
            if(e.getAttribute("name").toLowerCase().equals("characters")) {
                NodeList charList = rowElem.getElementsByTagName("row");
                for(int chars = 0; chars < charList.getLength(); chars++) {
                    Element charElem = (Element) charList.item(chars);
                    System.out.println(charElem.getAttribute("name") +
                        " hat charId: " + charElem.getAttribute("characterID"));
                }
            }
        }
    }

}
So, eine Menge Code für wenig Ausgabe :) Normalerweise sollte die Ausgabe ungefähr so aussehen:

Isabella Loja hat die charId: 00001
Gossi91 hat die charId: 00002

Was macht der obere Code denn nun genau?
Dazu sollten wir uns evtl. erstmal die XML-Datei anschauen, die man zurück bekommt wenn Java die Abfrage an den Server startet:

<eveapi version="2">
    <currentTime>2013-10-29 11:47:44</currentTime>
    <result>
    <rowset name="characters" key="characterID" columns="name,characterID,corporationName,corporationID">
        <row name="Gossi Elarik" characterID="0001" corporationName="Republic Military School" corporationID="0001"/>
        <row name="Isabella Loja" characterID="0002 corporationName="DAXUS-AG" corporationID="0002 "/>
        <row name="Michael Rhein" characterID="0003 corporationName="State War Academy" corporationID="0003 "/>
    </rowset>
    </result>
    <cachedUntil>2013-10-29 11:56:28</cachedUntil>
</eveapi>

Wenn wir uns nun den Code oben ansehen, stoßen wir auf folgende Zeile:
 
NodeList nList = doc.getChildElementsByTagName("rowset"); 

Hier bekommen wir eine Liste zurück mit allen Elementen die als Tag-Namen haben.

Danach durchlaufen wir die Liste mit folgendem Statement:
 
for(int i = 0; i < nList.getLength(); i++) {

Anschließend prüfen wir ob das Element welches wir gerade untersuchen ein Attribut namens "characters" hat:
 
if(e.getAttribute("name").toLowerCase().equals("characters"))

Wenn dies zutrifft, erstellen wir eine List aller Unterelemente, die als Tag "row" haben, diese representieren in diesem Falle die einzelnen Zeilen, die die Characterinformationen beinhalten:
 
NodeList charList = rowElem.getElementsByTagName("row");

Als letzte durchlaufen wir die Liste wieder und geben den Characternamen und die Characterid ind er Konsole aus:

for(int chars = 0; chars < charList.getLength(); chars++) {
    Element charElem = (Element) charList.item(chars);
    System.out.println(charElem.getAttribute("name") +
        " hat charId: " + charElem.getAttribute("characterID"));
}

Ich hoffe bis hierhin hilft es schonmal etwas, Fortsetzung folgt...

Mehr Infos zu den einzelnen Möglichkeiten findet man hier:
http://wiki.eve-id.net/APIv2_Page_Index

Keine Kommentare:

Kommentar veröffentlichen