Nachdem ich nun längere Zeit nicht mehr gebloggt habe, hier mal was neues. Leider ist unser Projekt zum Thema ebay im Sand verlaufen und wir können dieses nicht weiter betreiben. Dadurch ist aber etwas Code freigeworden, den ich hier nun der Öffentlichkeit zugänglich machen möchte.

In diesem Fall handelt es sich um eine Implementierung eines Connectors, mit dem verschiedene Abfragen an ebay geschickt werden können. Die implementierten Methoden sind:

  • Auslesen von ebay-Kategorien
  • Version der Kategorien lesen
  • Einen Artikel laden
  • offizielle Ebay-Zeit lesen
  • Eine Suche innerhalb einer Kategorie durchführen

Download

Vielleicht kann ja jemand den Code brauchen, ich würde mich über passendes Feedback freuen!

Ich hoffe, dass ich eventuell noch ein paar Sachen finde, die interessant sein könnten und die dann auch hier posten kann…

Zum überprüfen, ob ein Artikel bereits ausgelaufen ist, benötigt man in der Regel die offizielle ebay Zeit.

Hier für gibt es den getOfficialEbayTimeCall. Dieser gibt die aktuell gültige ebay Zeit zurück.

Code & Download

Damit man nicht für jede Anfrage nach Kategorien einen ebay Call generieren muss, bietet es sich an, alle Kategorien in einer Datenbank zu speichern.

Welche Informationen man letztendlich benötigt, muss jeder für sein Projekt selbst entscheiden, ich habe hier mal eine einfache Repräsentation einer Kategorie gebaut.

Code&Download

Kategorien sind als Baum aufgebaut, haben also immer einen Verweis, der Richtung Wurzel weist.

Für die meisten ebay Abfragen werden wir den Datentyp com.ebay.soap.eBLBaseComponents.CategoryType verwenden.

Um alle Kategorien von ebay zu erhalten, gibt es mehrere Möglichkeiten.

Einmal den GetCategoriesCall und einmal den CategoriesDownloader. Letzterer ist für unser Vorhaben zu bevorzugen, da er die Kategorien beim Download cached und viel speichersparender zu verwenden ist.

Ebay gibt für die aktuellen Kategorien eine Version an. Man braucht also nur, wenn sich diese Versionsnummer von der lokalen unterscheidet, die Kategorien neu zu laden.

Um an die aktuelle Version zu kommen, verwenden wir den GetCategoriesCall.

Meine lokale Versionsnummer habe ich in einer Datenbank gespeichert, welche ich über einen DatabaseConnector anspreche. Diese Stelle muss dann natürlich an die jeweiligen Ansprüche angepasst werden.

Falls nun die Versionsnummer höher als die lokal gespeicherte ist, wird ein CategoriesDownload instanziiert und damit dann alle Kategorien geladen.

Diese können dann in lokale Objekte gewandelt werden und dann in die Datenbank gespeichert werden.

Download des Codes

Da ich leider online nirgends geeignete Beispiele zur ebay API gefunden habe, hier mal eine kleine Reihe an Auszügen aus meinem Code.

Für alle Aktionen wird das Objekt api-context vorrausgesetzt, dieses kann aber wiederverwendet werden.
Deswegen habe ich die Instanziierung ausgelagert. Diese Methode kann für alle Beispiele verwendet werden:
this.apiContext = new ApiContext();
ApiCredential cred = apiContext.getApiCredential();
cred.seteBayToken(auth);
apiContext.setApiServerUrl(host);
apiContext.setSite(SiteCodeType.GERMANY);
executor = Executors.newFixedThreadPool(4);
try {
getApiCallsAvailable();
} catch (OutOfCallsException e) {
this.end();
throw e;
}

Womit wir auch schon bei 2 kleinen Besonderheiten wären:

  • ich verwende zum steuern meiner Threads einen ExecutorService. Hiermit ist garantiert, dass ich nicht zuviele parallel laufende Anfragen an ebay sende, aber trotzdem mehrere Threads parallel laufen lassen kann
  • getApiCallsAvailable: hiermit frage ich die verbleibenen Calls ab. Ebay lässt pro Tag nur eine bestimmte Anzahl Calls zu, deswegen verhindert man mit der Abfrage, unnötigen Traffic

GetApiAccessRulesCall gc = new GetApiAccessRulesCall(getApiContext());
gc.getApiAccessRules();
ApiAccessRuleType a = gc.getReturnedApiAccessRules()[0];
if (a.getDailyUsage() > a.getDailyHardLimit()) {
throw new OutOfCallsException();
}
return a.getDailyHardLimit() - a.getDailyUsage();

Download des Codes

Natürlich will man nicht immer die ID zu einem Item raussuchen müssen, um dieses zu laden. Deswegen bietet die API auch eine Suchfunktion (GetSearchResultsCall).
Diesem wird, wie der zuletzt verwendete GetItemCall auch, im Konstruktor der API Kontext übergeben.
Danach kann man über verschiedene setter Suchkriterien hinzufügen.
Hier einmal eine einfache Suche, nach allen Items mit dem übergebenen String:
/**
* Führt die gegebene Suche durch und gibt die Ergebnisse in einem Array zurück
*/
public SearchResultItemType[] search(String search) throws Exception {
GetSearchResultsCall api = new GetSearchResultsCall(this.apiContext);
api.setQuery(search);
return api.getSearchResults();
}

Man könnte das ganze dann noch auf eine bestimmte Kategorien begrenzen:
/**
* Führt die gegebene Suche in der Kategorie durch und gibt die Ergebnisse in einem Array zurück
*/
public SearchResultItemType[] search(String search, String katID) throws Exception {
GetSearchResultsCall api = new GetSearchResultsCall(this.apiContext);
api.setQuery(search);
api.setCategoryID(katID);
return api.getSearchResults();
}

Um nur Sofortkauf oder Auktionen zu erhalten, könnte man folgendes setzen:

api.setItemTypeFilter(ItemTypeFilterCodeType.AUCTION_ITEMS_ONLY);bzw.
api.setItemTypeFilter(ItemTypeFilterCodeType.ALL_FIXED_PRICE_ITEM_TYPES);

Andere Typen sind in ItemTypeFilterCodeType festgelegt.

Weitere Einschränkungen sind in der Datei DialogGetSearchResults.java vom Example-Projekt ApiCallsDemo zu finden (u.a. Mindestpreis, Maximalpreis, Entfernung zum Artikelstandort …)