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