Tipps und Tricks für AngularJS, Teil 5: Transformationen und Interceptors

Seite 2: Antwortumwandlung und Interceptor

Inhaltsverzeichnis

Um die Deserialisierung empfangener Nachrichten zu beeinflussen, muss man eine transformResponse-Funktion bereitstellen. Im folgenden Beispiel ist sie als transformXmlResponse zu finden:

this.loadFluegeXML = function () {

params = {
abflugOrt: that.flugVonFilter,
zielOrt: that.flugNachFilter
};

var headers = {
"Accept": "application/xml",
"Accept-Language": "de"
};

var transformXmlResponse = function(data, headersGetter, status) {

var headers = headersGetter();

var contentType = headers["content-type"];

if (contentType.indexOf("xml") === -1) {
return data;
}

var x2js = new X2JS();
var json = x2js.xml_str2json(data);
return json;

};

var options = {
params: params,
headers: headers,
transformResponse: transformXmlResponse
};

$http
.get(baseUrl + "/api/flug", options)
.then(function (result) {

var data = result.data.ArrayOfFlug.Flug;
that.fluege = data;

}).catch(function (result) {
that.message = "Fehler: " + result.status + " " +
result.statusText;
});

}

Die Transformationsfunktion nimmt die empfangenen Daten, eine Funktion zum Zugriff auf die erhaltenen Kopfzeilen sowie den zugehörigen Statuscode entgegen. Die Kopfzeile Content-Type informiert über das Format der eingegangenen Daten. Handelt es sich dabei nicht um XML, liefert transformXmlResponse die empfangenen Daten unverändert zurück. Ansonsten wandelt sie die Daten mit X2JS in ein JavaScript-Objekt und retourniert es.

Zur Demonstration fragt das Beispiel anschließend die in XML vorliegenden Daten via HTTP ab. Dabei verweist es über das Objekt options auf die Funktion transformXmlResponse, sodass $http sie zum Deserialisieren heranzieht.

Soll die transformResponse-Funktion bei jedem Aufruf zum Einsatz kommen, ist sie bei $http oder $httpProvider zu registrieren. Dafür stellen die Dienste ein Array $http.defaults.transformResponse beziehungsweise $httpProvider.defaults.transformResponse zur Verfügung. Standardmäßig findet sich in ihnen eine Funktion, die ein empfangenes JSON-Objekt in eines in JavaScript umwandelt.

Zum Realisieren wiederkehrender Aufgaben können Entwickler für den $http-Service sogenannte Interceptors registrieren. Bei einem Interceptor handelt es sich um ein Objekt mit Funktionen, die der $http-Dienst vor dem Senden sowie nach dem Empfangen von Nachrichten anstößt. Die folgende Tabelle enthält einen Überblick der Funktionen, wobei alle optional sind.

Funktion Beschreibung
request Wird aufgerufen, bevor $http eine Anfrage versendet und nimmt als Parameter das aktuelle Konfigurationsobjekt entgegen, das den gewünschten Aufruf beschreibt. Die Funktion kann das Objekt verändern. Zum Zugriff verwendet das retour gelieferte Objekt $http.
requestError Wird aufgerufen, wenn die Funktion request eines vorgelagerten Interceptors einen Fehler gemeldet hat. Die empfangene HTTP-Antwort wird übergeben und lässt sich von requestError ändern. Der Dienst $http verwendet das von requestError zurückgelieferte Objekte als Ergebnis der Anfrage.
response Wird aufgerufen, nachdem $http eine Antwort empfangen hat, die eine Erfolgsmeldung repräsentiert (Statuscode 2xx). Die Antwort des Webservers wird übergeben und lässt sich von response ändern. Der Dienst $http verwendet das zurückgelieferte Objekte als Ergebnis der Anfrage.
responseError Wird aufgerufen, nachdem $http eine Antwort, die eine Fehlermeldung repräsentiert, empfangen hat. Die Fehlermeldung des Web-Servers wird übergeben und lässt sich von responseError ändern. Der Dienst $http verwendet das zurückgelieferte Objekte als Ergebnis der Anfrage.

Die aufgelisteten Funktionen können ein Promise-Objekt retournieren. Liefert eine Funktion keines, interpretiert $http das als Erfolgsmeldung. Promises im Zustand resolved wertet $http ebenso. Liegt hingegen ein Promise mit dem Zustand rejected vor, geht $http von einem Fehler aus. Das betrachtete Beispiel nutzt deswegen lediglich für die Fehlermeldungen Promises, die es mit $q erzeugt.