Sollte ich XML auf dem Server analysieren oder einen Proxy bereitstellen und den Browser es analysieren lassen?


11

Ich muss eine Schnittstelle mit einer API eines Drittanbieters herstellen. Mit dieser API stelle ich eine GET-Anfrage im Browser des Endbenutzers und erhalte eine XML-Antwort. Diese Daten sollen in einer browserbasierten Anwendung verwendet werden, in der der Benutzer sie durchsuchen, Entscheidungen treffen usw. kann. Das Hauptproblem besteht darin, dass die meisten Browser die domänenübergreifende XML-Verwendung gesperrt haben, sodass ich sie nicht einfach abrufen kann das XML von der API.

Die Gesamtdaten sind jedoch grundsätzlich in zwei Sätze unterteilt.

  1. Der erste Datensatz ist öffentlich und muss nur von Zeit zu Zeit aktualisiert werden, sodass er für alle Benutzer auf der Serverseite zwischengespeichert werden kann, was den Datenverkehr erheblich erleichtert.
  2. Der zweite Datensatz ist für jeden Benutzer privat und individuell. Diese Daten werden auch in der API häufiger aktualisiert. Dies führt dazu, dass das Caching viel weniger effektiv ist.

Aus Gründen der Skalierbarkeit möchte ich die Serverlast so gering wie möglich halten.

Ich sehe zwei Möglichkeiten vor mir:

  1. Stellen Sie einen Proxy bereit, mit dem XML-Anforderungen an den Server eines Drittanbieters und direkt zwischen dem Client und der API eines Drittanbieters weitergeleitet werden können.
  2. Lassen Sie den Server die Konvertierung von XML nach JSON durchführen und unnötige Informationen entfernen. Dies bedeutet im Wesentlichen, dass eine neue API für unseren Server erstellt wird, die sich in Anforderungen der Drittanbieter-API niederschlägt

Was wäre der beste Weg, um die Daten dem Benutzer zur Verfügung zu stellen? (Muss nicht eine der beiden Optionen sein)


Wie ist die Beziehung der XML-Quelle zu dem Code, der sie im Browser interpretiert? Denn wenn Sie Ihren eigenen (nicht unterstützten) Client-Code geschrieben haben, um aus Daten von Drittanbietern zu speisen, denke ich zunächst daran, dass dieser Drittanbieter eines Tages geringfügige Änderungen am XML vornehmen und Ihre Anwendung endgültig beschädigen wird.
SJuan76

Der Drittanbieter hat seine API-Version bereits einmal aktualisiert. Sie haben die alte Version ein wenig beibehalten, damit die Leute ihren Code aktualisieren können, um die neue API zu verwenden. Die Struktur der Daten im XML hat sich jedoch nur zwischen den API-Versionen geändert.
Amethystdragon

1
Wenn sich die API häufig ändert, lohnt es sich wahrscheinlich, Ihr eigenes Schema zu deklarieren und über einen Dienst zu verfügen, der als Middleware fungiert und die Daten in etwas manipuliert, das Ihr Client erwartet. Ich denke, die Frage lautet: "Was ist einfacher, den Client zu aktualisieren oder den Server zu aktualisieren?"
Hyperbole

Es ist nicht häufig. Es hat sich einmal über 10 Jahre geändert.
Amethystdragon

Antworten:


12

Die Proxy-Option ist am einfachsten zu implementieren. Sie müssen keine benutzerdefinierte Entwicklung durchführen. Sie müssen lediglich einen Proxy einrichten. Es ist auch unkompliziert: Es muss kein zusätzlicher Code verwaltet werden. Wenn sich die API ändert, müssen Sie keine Änderungen an Ihrer Seite vornehmen.

Ein Proxy wäre eine bevorzugte Wahl:

  • Wenn Sie funktionierende Software schnell versenden müssen. Dies macht es beispielsweise zu einer guten Wahl, wenn Sie eine Funktion ausliefern wollten, aber während der Implementierungsphase des Projekts festgestellt haben, dass Sie nicht einfach domänenübergreifende AJAX-Anforderungen stellen können.

  • Oder wenn die aktuelle API gut gestaltet ist : Die Architektur ist gut, die Aufrufe sind sehr klar, die Dokumentation ist vollständig und leicht zu verstehen.

  • Oder wenn sich die aktuelle API ändern kann. Wenn es sich ändert, müssen Sie nur die JavaScript-Implementierung ändern. Wenn Sie anstelle eines Proxys die Ergebnisse analysieren und Ihren eigenen JSON generieren, besteht das Risiko, dass die Änderungen an der API die Änderungen in Ihrem serverseitigen Code erfordern.

Andererseits hat das Parsen des Ergebnisses den Vorteil, dass die API auf der Clientseite vollständig abstrahiert werden kann. Dies ist eine langsamere Alternative, da die neue Schnittstelle entworfen werden muss (wenn die ursprüngliche API nicht gut entworfen wurde) und die Funktionen zum Extrahieren, Transformieren und Laden implementiert werden müssen. Für ein großes Projekt kann dies jedoch eine gute langfristige Wahl sein. Dies ist eine bevorzugte Wahl:

  • Wenn Sie zusätzliche Funktionen benötigen. Sie können die verschiedenen Funktionen nutzen, die in der ursprünglichen API nicht verfügbar waren, z. B. das Caching auf einer Ebene, die von einem normalen Proxyserver nicht unterstützt wird, oder die Verschlüsselung oder ein anderes Authentifizierungsmodell .

    Wenn beispielsweise die Anzahl der AJAX-Anforderungen zu einem Problem wird oder wenn ein bidirektionales Kommunikationsmodell sinnvoll ist, können Sie Web Sockets implementieren.

  • Oder wenn die aktuelle API nicht gut gestaltet ist. Mit diesem Ansatz können Sie wie mit einem Fassadenmuster die API neu gestalten. Wenn das Original schlecht ist, können Sie mit einer Fassade die schlechten Designentscheidungen der ursprünglichen Autoren einer Legacy-API lösen. Sie können auch auf große Teile wie die Gesamtarchitektur der API, aber auch auf Details wie die Namen von Argumenten oder die Fehlermeldungen reagieren.

    Während das Ändern einer vorhandenen API manchmal unmöglich ist, kann eine Fassade es ermöglichen, mit einem sauberen Code zu arbeiten, der die Nachteile und Fehler im ursprünglichen Design abstrahiert.

  • Oder wenn sich die aktuelle API ändern kann. In der Tat ziehen Sie es möglicherweise vor, serverseitigen Code anstelle von JavaScript zu ändern, wenn sich die API im Laufe der Zeit ändert, während die öffentliche Oberfläche Ihrer Fassade davon nicht betroffen ist. Dies ist möglicherweise einfacher, weil Sie mehr Erfahrung mit der serverseitigen Programmierung haben oder weil Sie mehr Tools für das serverseitige Refactoring kennen oder weil es in Ihrem Projekt einfacher ist, mit der serverseitigen Codeversionierung umzugehen.

Möglicherweise stellen Sie fest, dass ich nicht über JSON, Leistung, Caching usw. gesprochen habe. Dafür gibt es einen Grund:

  • JSON vs. XML: Es liegt an Ihnen, die richtige Technologie auszuwählen . Dazu messen Sie objektiv die Überhitzung von XML über JSON, die Zeit, die zum Serialisieren von Daten benötigt wird, und die einfache Analyse.

  • Leistung: Benchmarking verschiedener Implementierungen, Auswahl der schnellsten, Profilierung und Optimierung anhand der Ergebnisse des Profilers. Stoppen Sie, wenn Sie die in den nicht funktionalen Anforderungen angegebene Leistung erreichen.

    Verstehe auch, was du erreichen willst. Es gibt mehrere Teile, die miteinander interagieren: die ursprüngliche API, die Bandbreite zwischen Ihrem Server und der API, die Leistung Ihres Servers, die Bandbreite zwischen Ihrem Server und den Endbenutzern und die Leistung ihrer Computer. Wenn Sie aufgefordert werden, innerhalb von 30 ms eine Antwort auf eine Anfrage zu erhalten, die ursprüngliche API jedoch 40 ms benötigt. Wenn Sie die Anfrage bearbeiten, unabhängig davon, was Sie tun, können Sie nicht die erforderliche Leistung erzielen.

  • Caching: Caching ist eine der Techniken, mit denen sich Ihre Webanwendung schneller anfühlt, die Bandbreite reduziert wird usw.

    1. Stellen Sie sicher, dass Sie auch das Client-Caching verwenden (das serverseitige Caching verringert nicht die Bandbreitennutzung zwischen Ihnen und den Kunden), da das ordnungsgemäße Einrichten der HTTP-Header häufig schwierig ist.

    2. Stellen Sie sicher, dass Sie richtig bestimmen, was, wie lange und wann zwischengespeichert werden soll: Wenn sich die Beschreibung des Produkts vor 10 Sekunden geändert hat, die Kunden einer E-Commerce-Website jedoch weiterhin die alte Version sehen, ist dies in Ordnung. Wenn der Eigentümer die Beschreibung geändert, eingereicht und die vorherige Variante aufgrund des Cachings weiterhin angezeigt hat, ist dies problematisch.

    3. Konzentrieren Sie sich nicht nur auf das Caching. Auch die Minimierung ist wichtig. Das Reduzieren der Anzahl von Anfragen kann ebenfalls vorteilhaft sein.


1
+1 Ich zögerte ein wenig darüber, ob ich Caching erwähnen sollte oder nicht und entschied mich schließlich dagegen. Es lohnt sich immer noch, darauf einzugehen, guter Punkt.
JensG

7

Es gibt eine dritte Option, die Sie möglicherweise nicht gesehen haben: Cross Origin Resource Sharing (CORS) .

Der CORS-Standard fügt neue HTTP-Header hinzu, mit denen Server Ressourcen für zulässige Ursprungsdomänen bereitstellen können. Browser unterstützen diese Header und respektieren die von ihnen festgelegten Einschränkungen.

Beispiel : Angenommen, Ihre Website lautet http://my-cool-site.com und Sie haben eine Drittanbieter-API unter der Domain http://third-party-site.com , auf die Sie über AJAX zugreifen können.

Nehmen wir an, eine Seite, die Sie von my-cool-site.com aus bedienen, hat eine Anfrage an Third-Party-Site.com gesendet. Normalerweise lehnt der Browser des Benutzers AJAX-Anrufe an eine andere Site als Ihre eigene Domain / Subdomain gemäß der Sicherheitsrichtlinie von Same-Origin ab . Wenn der Browser und der Server eines Drittanbieters CORS unterstützen, geschieht Folgendes:

  • Der Browser sendet den folgenden HTTP-Header an Third-Party-Site.com

    Origin: http://my-cool-site.com
  • Wenn der Server eines Drittanbieters Anforderungen von Ihrer Domain akzeptiert, antwortet er mit dem folgenden HTTP-Header:

    Access-Control-Allow-Origin: http://my-cool-site.com
  • Um alle Domänen zuzulassen, kann ein Drittanbieter-Server diesen Header senden:

    Access-Control-Allow-Origin: *
  • Wenn Ihre Site nicht erlaubt ist, gibt der Browser einen Fehler aus.

Wenn die Clients über ziemlich moderne Browser verfügen , die CORS unterstützen , und Ihr Drittanbieter-Server auch CORS unterstützt , können Sie dies definitiv mit geringfügigen Änderungen an Ihrem Code tun.

Ich habe eine nette Erklärung zu CORS gefunden , auf der Sie auch einen anderen Weg finden, dies zu tun: JSONP . JSONP würde jedoch eine ganze Reihe von Änderungen an Ihrem Code erfordern.

Um eine CORS-Anfrage zu stellen, verwenden Sie einfach XMLHttpRequestFirefox 3.5+, Safari 4+ und Chrome und XDomainRequestObjekt in IE8 +. Wenn XMLHttpRequestder Browser bei Verwendung eines Objekts feststellt, dass Sie versuchen, eine domänenübergreifende Anforderung zu stellen, wird das CORS-Verhalten nahtlos ausgelöst.

Hier ist eine Javascript-Funktion, mit der Sie ein browserübergreifendes CORS-Objekt erstellen können.

function createCORSRequest(method, url){
    var xhr = new XMLHttpRequest();
    if ("withCredentials" in xhr){
        // XHR has 'withCredentials' property only if it supports CORS
        xhr.open(method, url, true);
    } else if (typeof XDomainRequest != "undefined"){ // if IE use XDR
        xhr = new XDomainRequest();
        xhr.open(method, url);
    } else {
        xhr = null;
    }
    return xhr;
}

Da Sie sagen, dass "die meisten Browser die domänenübergreifende XML-Verwendung gesperrt haben", unterstützt Ihr Server eines Drittanbieters möglicherweise CORS nicht. Dann müssen Sie alternative Ansätze finden.



1
Könnten Sie versuchen, den Inhalt der Links zusammenzufassen? Links sind anfällig für Link-Rot und daher nicht der beste Weg, um Informationen über SE zu vermitteln :)
Ampt

Leider unterstützt der Server eines Drittanbieters CORS nicht.
Amethystdragon

4

Aus Gründen der Skalierbarkeit möchte ich die Serverlast so gering wie möglich halten

Ich denke, das deutet mehr oder weniger auf die Antwort hin. Ob dem Kunden vorverarbeitete Daten zur Verfügung gestellt werden oder nicht, hängt hauptsächlich von folgenden Faktoren ab:

  1. der Unterschied in Bezug auf den Verkehr
  2. die Auswirkungen der Verarbeitung auf die Leistung
  3. die Auswirkungen eines anderen Datenformats auf den Client

Wenn das XML vergleichsweise klein ist oder nur wenige Anforderungen vorliegen, kann es sinnvoll sein, es einfach an den Client weiterzuleiten und zu vergessen. Gleiches gilt, wenn die vorverarbeiteten Daten noch einen großen Teil der Originaldaten ausmachen oder wenn der Client nicht in der Lage ist, von einem anderen Datenformat (z. B. JSON) zu profitieren.

Wenn der Client jedoch Probleme mit der Verarbeitung eines großen XML-Datensatzes hat oder wenn der Client nur einen kleinen Teil der ursprünglichen XML-Daten benötigt, kann es sinnvoll sein, eine Vorverarbeitung auf der Serverseite durchzuführen.

Am Ende ist es einfacher, einen Server zu skalieren, als einen Client / Browser oder die verfügbare Bandbreite zu skalieren. Um es in einen Satz zu fassen, es hängt davon ab, wo sich der Engpass im System befindet.


+1 und Hinzufügen - Testen Sie die Leistung in verschiedenen Situationen.
SeraM

0

Meine Wahl wäre, die Ergebnisse zwischenzuspeichern und zu komprimieren (unnötige Informationen wegzuwerfen) und gzip an den Client-Browser zu senden, Ihre Option Nr. 2 . Da Browser normalerweise keine High-End-CPUs sind und die Netzwerkleitungen von Server zu Browser nur eine begrenzte Kapazität haben. Ich spreche von mobilen Clients . Wenn Sie nicht vorhaben, mobile Clients zu unterstützen, wählen Sie, was einfacher ist, z. B. einigeGoogle:CORS proxy

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.