Webdienstdaten importieren: Die neue HTTP-Anforderung in JMP® 14 (US 2018 231)
Niveau: Mittelstufe
Bryan Boone, JMP-Hauptsoftwareentwickler, SAS
Staatliche und private Einrichtungen stellen ihre Daten zunehmend über RESTful-Dienste im Internet zur Verfügung. JMP 14 bietet eine neue Funktion namens HTTP Request , die über JSL verfügbar ist und den Zugriff auf diese RESTful-Dienste ermöglicht. Dieses Dokument beschreibt RESTful-Dienste und bietet mehrere Beispiele für die Verwendung von HTTP Request zum Einspeisen neuer Daten in JMP.
Was ist REST
REST (Representational State Transfer) ermöglicht die Interoperabilität zwischen Computersystemen im Internet. Ein RESTful-Dienst ist ein webbasierter Dienst, der dieses Paradigma nutzt. Eine RESTful-API ist eine Anwendungsprogrammierschnittstelle (API), die HTTP-Anfragen zum Abrufen , Senden , Senden und Löschen von Daten verwendet, um mit dem RESTful-Dienst zu interagieren.
Das HTTP-Protokoll definiert eine Reihe von HTTP-Anforderungsmethoden, um die Aktion anzugeben, die ein Client vom Server für eine Ressource ausführen lassen möchte. Diese sind:
|
ERHALTEN
|
Fordern Sie die Ressource an
|
|
KOPF
|
Fordern Sie nur Ressourcenmetadaten an
|
|
POST
|
Anfragen zur Annahme der Ressource
|
|
SETZEN
|
Anfragen zum Speichern oder Erstellen der Ressource
|
|
LÖSCHEN
|
Anfragen zum Löschen der Ressource
|
|
PATCH
|
Anforderung zum Ändern des Status einer Ressource
|
Neue Terminologie, vertraute Aktivitäten
Dies mag wie ein völlig neues Konzept erscheinen, aber Sie sind bereits mit zwei der gängigsten Anforderungsmethoden vertraut: ERHALTEN und POST .
ERHALTEN
ERHALTEN
has two personalities.
Die erste Persönlichkeit besteht lediglich darin, eine Ressource zu ERHALTEN . Das heißt, die Absicht besteht lediglich darin, auf eine Webressource zuzugreifen. Dies ist in Abbildung 1 zu sehen. Hier greift der Browser auf die Webseite zu. 
Figure 1. “
ERHALTEN
for a web resource”
Die zweite Möglichkeit ist der Zugriff auf eine Ressource mithilfe eines sogenannten Abfragestrings. Ein Abfragestring ist eine Reihe von Schlüssel-Wert-Paaren, die von der Webressource definiert und vom Client verwendet werden, um den Server aufzufordern, die Abfrage mithilfe dieser Parameter zu filtern oder zu ändern . Dies ist in Abbildung 2 zu sehen. Hier fordert der Browser den Server auf, eine Abfrage mithilfe von Folgendem zu ändern:
POST
POST hingegen ist komplexer. Ein POST fordert den Server auf, eine Ressource zu ändern oder zu erstellen. Ein POST enthält typischerweise ein HTML-Formular, das wiederum eine Sammlung von Schlüssel-Wert-Paaren aus Zeichendaten und/oder Schlüssel-Wert-Paaren aus Dateien enthält. Abbildung 3 zeigt ein Beispiel für die Anmeldung eines Benutzers bei Amazon. Die Schlüssel-Wert-Paare lauten:
|
E-Mail
|
Ihre E-Mail-Anmeldung
|
|
Passwort
|
Ihr Passwort
|
Die Schaltfläche „Anmelden“ führt den POST aus
Abbildung 3. „Formulardaten an eine Webressource senden “
Warum es verwenden?
Das HTTP-Protokoll ermöglicht es uns, uns die Datenautobahnen so vorzustellen: „Die Autobahnen sind asphaltiert, die Straßenschilder sind aufgestellt und die Brücken gebaut.“ Der Standard hat die Gründung neuer Datenmanagement-Unternehmen ermöglicht. Darüber hinaus hat die Einführung des HTTP-Standards die Informationssilos beseitigt, die in etablierten Unternehmen häufig anzutreffen sind. Zu diesen Unternehmen gehören unter anderem:
|
Text-Processing.com (Stimmungsdaten)
|
Jenkins
|
|
Es gibt
|
Der HUB
|
|
Office 365
|
Google
|
|
Briefkasten
|
Ein Laufwerk
|
|
AWS (Amazon Web Services)
|
US-Volkszählungsbüro
|
|
IN
|
PubChem
|
|
New York Times
|
Fitbit
|
|
Yahoo
|
Bitcoin
|
|
Marvel-Comics
|
SAS
|
|
OpenAQ
|
JMP
|
Wie man es benutzt
JSON
JSON (JavaScript Object Notation) ist ein einfaches Datenaustauschformat. Es basiert auf einer Teilmenge der Programmiersprache JavaScript. JSON ist ein sprachunabhängiges Textformat, verwendet aber Konzepte, mit denen die meisten Programmierer bereits vertraut sind.
JSON basiert auf zwei Strukturen:
- Eine Sammlung von Name/Wert-Paaren. (Wörterbuch, Hash-Tabelle, assoziatives Array, …)
- Eine geordnete Liste von Werten. (Array, Vektor, Liste, ...)
Neue Terminologie, vertraute Aktivitäten (wieder)
JSL
JSL ist die bevorzugte Skriptsprache, wenn JMP zum Einsatz kommt. JSON mag ein neuer Begriff sein, aber JSL unterstützt die beiden von JSON benötigten Datenstrukturen.
Liste
Listen sind Container zum Speichern von Elementen, beispielsweise den folgenden:
- Zahlen
- Variablen
- Zeichenfolgen
- Ausdrücke (z. B. Zuweisungen oder Funktionsaufrufe)
- Matrizen
- verschachtelte Listen
Assoziatives Array
- Ein assoziatives Array ordnet eindeutige Schlüssel Werten zu, die nicht eindeutig sein können. Ein assoziatives Array wird auch als Wörterbuch, Map, Hash-Map oder Hash-Tabelle bezeichnet.
JSL enthält auch zwei Funktionen, die spezifisch für die JSON-Verarbeitung sind.
JSON analysieren
- Konvertiert JSON-Text basierend auf der Struktur der JSON-Daten in ein assoziatives Array oder eine Liste.
Als JSON-Ausdruck
- Gibt eine JSON-Darstellung des Ausdrucks zurück.
Diese Funktionen ermöglichen dem Skriptautor die nahtlose Konvertierung in und aus JSL-Containern und JSON.
HTTP-Anforderung
HTTP-Anforderung ist neu in JMP 14. Ursprünglich wurde die Technologie für die Interaktion zwischen JMP und JMP Public entwickelt. Schnell wurde erkannt, dass sie über die Veröffentlichung von Daten in JMP Public hinaus weitere Anwendungsmöglichkeiten bietet, und die Technologie wurde in JSL als HTTP-Anforderung veröffentlicht.
Einführung in HTTP-Anfragen
HTTP-Anforderung unterstützt nahtlos sowohl das http- als auch das https-Protokoll und kapselt einen Großteil des Verhaltens, das Sie von cURL erwarten würden.
cURL wird in Kommandozeilen oder Skripten zur Datenübertragung verwendet. Es kommt auch in Autos, Fernsehgeräten, Routern, Druckern, Audiogeräten, Mobiltelefonen, Tablets, Set-Top-Boxen und Mediaplayern zum Einsatz und bildet das Internet-Übertragungs-Backbone für Tausende von Softwareanwendungen, die täglich Milliarden von Menschen betreffen.
Wichtiger noch: Stellen Sie sich die HTTP-Anforderung als Bindeglied zwischen Webressourcen und JSL vor. Das heißt, die HTTP-Anforderung kommuniziert mit einer Webressource und ermöglicht dem Skript-Autor, Antworten in JSL zu verarbeiten. Die JSL-Komplexität wird vom Autor gesteuert.
Die am häufigsten verwendeten HTTP-Methoden bei der Interaktion mit einer Webressource sind:
Verwenden einer HTTP-Anforderung in einer GET-Aktion
Die Aktion „ERHALTEN“ ist wahrscheinlich die häufigste HTTP-Anforderungsaktion . Diese Aktion ist schreibgeschützt und kann Daten in JMP übertragen.
Allgemeine Meldungen für HTTP-Anforderungen :
-
"Verfahren"
-
„URL“
-
„Abfragezeichenfolge“
-
"Schicken"
Figure 4. “
HTTP-Anforderung
ERHALTEN
”
HTTP-Anforderung ERHALTEN -Aktionen werden oft von einem „Query String“ begleitet, um Parameter an eine Webressource zu senden. Abbildung 5 verwendet eine HTTP-Anforderung mit einem „Query String“ . In JSL ist ein „Query String“ ein assoziatives Array , das einen Schlüssel einem Zeichenwert oder einer Liste von Zeichenwerten zuordnet. Wenn das Skript in Abbildung 5 ausgeführt wird, wird die URL automatisch erweitert zu:
http://quotes.rest/qod.json?category=inspire
Figure 5. “
HTTP-Anforderung
ERHALTEN
using a ‘
Abfragezeichenfolge'
”
Verwenden einer HTTP-Anforderung in einer POST-Aktion
HTTP-Anforderung POST- Aktionen sind oft komplexer.
Allgemeine Meldungen für HTTP-Anforderungen :
-
"Verfahren"
-
„URL“
-
"Bilden"
-
„JSON“
-
"Datei"
-
"Klecks"
-
"Schicken"
Abbildung 6 zeigt eine HTTP-Anforderung für „ Formular“ -Daten. In JSL können „Formular“ -Daten zwei Attribute haben: „Fields“ und/oder „Files“ . Beide sind JSL- assoziative Arrays , die einen Schlüssel einem Zeichenwert oder einer Liste von Zeichenwerten zuordnen. Im Fall von „Files“ handelt es sich bei dem Zeichenwert bzw. der Liste von Zeichenwerten um die Dateinamen, die dem „ Formular“ hinzugefügt werden sollen.
Figure 6. “
HTTP-Anforderung
POST
using a
Bilden
”
Abbildung 7 zeigt eine HTTP-Anforderung im JSON- Format. In JSL kann „JSON“ entweder ein assoziatives Array oder Zeichendaten im JSON-Format sein. Als JSON-Ausdruck wird ein wohldefiniertes JSON-Objekt zur Verwendung mit der HTTP-Anforderung erstellt. JSON-Daten werden als Hauptteil der Anfrage gesendet. 
Figure 7. “
HTTP-Anforderung
POST
using ‘
JSON'
”
Abbildung 8 zeigt eine HTTP-Anforderung mit dem Datentyp „ File“ . In JSL ist „File“ der Dateiname, den Sie als Text der Anforderung senden möchten. 
Figure 8. “
HTTP-Anforderung
POST
using ‘
Datei'
”
Eine letzte Aktion für die HTTP-Anforderung „ Blob“ -Daten. In JSL bezeichnet „Blob“ binäre Blob-Daten, die als Textkörper der Anfrage gesendet werden sollen. Das bedeutet, dass Sie keine Datei auf die Festplatte schreiben müssen, bevor Sie sie als Teil einer Anfrage senden.
Der
ERHALTEN
Aktion ist die einfachste Anfrage, die man stellen kann, während
POST
ist am komplexesten. Die Interaktion zwischen
HTTP-Anforderung
Die Webressource wird immer vom Server definiert. Obwohl das HTTP-Protokoll ein klar definierter Standard ist, werden die Daten (und Datenstrukturen) für jede Webressource einzeln definiert. Das heißt, die API für One Drive unterscheidet sich von der für Dropbox, obwohl beide ähnliche Funktionen erfüllen.
Zurück an den Absender
Daten aus einer HTTP-Anforderung „ Senden“ können je nach Webressource entweder Zeichendaten, binäre Blob-Daten oder leere Daten sein. Die Überprüfung der zurückgegebenen Daten auf „ Ist leer“ stellt die gröbste Ebene der Datenanalyse dar (neben keiner). Für eine detailliertere Analyse können Sie jedoch „ Ist String“ verwenden, um nach Zeichendaten zu suchen.
Für noch detailliertere Untersuchungen können Sie „Get MIME Type“ verwenden. Gängige MIME-Typen finden Sie im Artikel „ Unvollständige Liste der MIME-Typen“ im Abschnitt „Referenzen“ des Dokuments.
Schließlich können Sie bei Bedarf HTTP-Statuscodes auf niedriger Ebene einer Webressource mithilfe dieser Nachrichten untersuchen:
|
„Hat Informationen“
|
100-199
|
|
„Ist erfolgreich“
|
200-299
|
|
„Hat Umleitung“
|
300-399
|
|
„Hat Client-Fehler“
|
400-499
|
|
„Hat Serverfehler“
|
500-599
|
|
„Hat einen Fehler“
|
Es liegt entweder ein Client- oder ein Serverfehler vor
|
|
„Status abrufen“
|
Der HTTP-Statuscode
|
Beschreibungen der HTTP-Statuscodes finden Sie im Artikel „Statuscodedefinitionen“ im Referenzabschnitt des Dokuments.
Wo man es verwendet
Obwohl HTTP-Anforderung entweder Zeichendaten oder binäre Blob-Daten von jeder beliebigen Webressource verarbeiten kann, konzentrieren wir uns auf Zeichendaten von RESTful-Diensten, nämlich JSON-Daten.
Das ist süß
Eines der neuen Datenmanagement-Unternehmen, das auf dem HTTP-Protokollstandard basiert und REST verwendet, ist PubChem. PubChem wurde 2004 als offene Chemie-Datenquelle an den National Institutes of Health (NIH) gegründet. Hunderte von Datenquellen von Institutionen wie Universitäten, Pharmaunternehmen, Behörden und Chemielieferanten werden monatlich zur Aktualisierung der PubChem-Datensätze genutzt. Es handelt sich um die größte Sammlung öffentlich zugänglicher chemischer Informationsquellen.
PubChem unterteilt seine Datenabfragen in Substanzen, Verbindungen, Tests usw. Daraus können Sie eine große Bandbreite an Eigenschaften, Beschreibungen, Dosierungen und anderen interessanten Merkmalen abrufen.
Ich habe das als M&M-Zutaten gelesen. 
Abbildung 9. „Zutaten einfacher M&Ms“
Ich habe ein JSL-Skript geschrieben, das eine JMP-Datentabelle mit den Zutaten von Plain M&M's erstellt, um zu sehen, was darin enthalten ist. Es war keine Überraschung, dass die Zutaten viele künstliche Farbstoffe enthielten.
Eine JMP-Teildatentabellendarstellung sieht folgendermaßen aus: 
Abbildung 10. „Teildatentabelle der Zutaten von Plain M&M“
Wenn das JSL-Skript ausgeführt wird, wird HTTP-Anforderung verwendet, um das Bild der Substanz oder Verbindung sowie andere Eigenschaften abzurufen, die vom RESTful-Dienst von PubChem bereitgestellt werden. 
Abbildung 11. „Teildatentabelle der Zutaten von Plain M&M mit PubChem-Daten“
Die interessanten RESTful-Service-URLs sind:
( [NAME] ist der Name der Substanz oder Verbindung aus den Abbildungen 9 und 10.)
Um die Bilddaten einer Verbindung wie Laktose abzurufen, sieht die HTTP-Anforderung folgendermaßen aus: 
Abbildung 12. „ ERHALTEN -ing das Bild von Laktose aus PubChem“

Abbildung 13. „
ERHALTEN und Anzeigen des Bildes von Lactose aus PubChem“
Die Lactose-Anfrage verwendet den PubChem-Endpunkt für Verbindungen. Dabei kommen zwei weitere Konzepte zum Einsatz. Das erste ist „Encode URI“ . Die URI-Kodierung, auch als Prozentkodierung bekannt, stellt sicher, dass die RESTful-URL ausschließlich ASCII-Zeichen enthält (was bei Lactose glücklicherweise der Fall ist). Das zweite Konzept ist „MIME-Typ abrufen“ . Der Rückgabewert dieses PubChem-Endpunkts sind binäre Blob-Daten (ein PNG-Bild). Die Prüfung „MIME-Typ abrufen“ stellt sicher, dass der Blob tatsächlich ein PNG ist, bevor er mit „New Image“ verwendet wird, da dieser Endpunkt Zeichendaten zurückgibt, wenn kein PNG gefunden wird.
Um den vollständigen Datensatz zu Laktose in JSON-Daten abzurufen, sieht die HTTP-Anforderung folgendermaßen aus:
Abbildung 14. „ ERHALTEN – den vollständigen Datensatz zu Laktose aus PubChem“
Der durch PubChem definierte Endpunkt gibt an, dass das Suffix /JSON anzeigt, dass der RESTful-Dienst JSON-Daten zurückgeben soll. Eine Überprüfung des MIME-Typs von „data“ ist also nicht erforderlich. Wir müssen jedoch das JSON verarbeiten. Es gibt [mindestens] zwei Möglichkeiten, die zurückgegebenen „ data“ zu verarbeiten. Die erste besteht in der Verwendung von „JSON To Data Table“ . Dabei wird versucht, aus den „data“ eine JMP-Datentabelle zu erstellen. Bei rechteckigen oder tabellarischen Daten funktioniert dies gut (und schnell). Allerdings geben nicht alle RESTful-Dienste tabellarische Daten zurück (PubChem ist einer davon). Die zweite Möglichkeit, zurückgegebene Daten zu verarbeiten, ist „Parse JSON“ . Dadurch wird ein JSL Assoziatives Array erstellt. Das bedeutet, dass Sie das JSON nicht parsen müssen. Sie müssen jedoch wissen, wie die zurückgegebenen Daten strukturiert sind. Das heißt, Sie müssen wissen, ob es sich um ein Schlüssel/Wert-Paar oder ein Schlüssel/Wert-Paar handelt. Dies ist nicht so schwierig, wie es scheint, da Sie das Roh-JSON im JMP-Protokoll erfassen und mit einem beliebigen JSON-Editor seine Struktur untersuchen können.
Eine Teilanzeige der JSON-Daten für Laktose sieht folgendermaßen aus: 
Abbildung 15. „Partielle Laktose-JSON-Daten von PubChem“
Dieser Editor zeigt eine nebeneinander stehende Darstellung von JSON-Rohdaten und dem entsprechenden JSON-Objekt. Wenn Sie die Daten untersuchen, denken Sie bei einem {..} in JSON an JSL Assoziatives Array . Wenn Sie auf ein [..] stoßen, denken Sie an JSL Liste .
Mit dieser Technik können Sie das in Abbildung 14 gezeigte vollständige Datensatzskript ändern und damit eine JMP-Datentabelle für die Eigenschaften von Laktose erstellen: 
Abbildung 16. „ ERHALTEN – den vollständigen Datensatz von Lactose aus PubChem erstellen und „ props“ zu einer Datentabelle machen“
Dieses Beispiel verwendet Parse JSON , um das Roh-JSON von PubChem in ein JSL Assoziatives Array zu übersetzen. Nach der Untersuchung der JSON-Datenstruktur stellen wir fest, dass wir nur an den „Props“-Daten im Lactose-JSON interessiert sind. Anschließend können wir die bekannte JSL Assoziatives Array -Navigation verwenden, um die JSL -Liste unter „PC_Compounds“ abzurufen. Wir benötigen nur das erste Element der Liste (da die meisten „ Requisiten“ wiederholt werden).
„Props“ -Daten sind ein JSL Assoziatives Array , sodass wir „props“ mithilfe des JSON-Ausdrucks zurück in JSON übersetzen und in JSON in Datatable verwenden können. Das Ergebnis ist in Abbildung 17 dargestellt. 
Abbildung 17. „Teildatentabelle zu den Laktoseeigenschaften“
Denken Sie daran: Die HTTP-Anforderung ist lediglich ein Bindeglied zwischen Webressourcen und JSL. Sobald Sie Ihre Daten in JSL übertragen haben, können Sie sie je nach Bedarf einfach oder komplex verwenden.
Etwas zum Staunen
2014 entwickelte Marvel Comics einen RESTful-Dienst, der Nutzern Zugriff auf 70 Jahre Comic-Informationen ermöglicht. Die Marvel Comics API ist nur durch die Vorstellungskraft des Skripters begrenzt, daher musste ich mich natürlich für einen Schlüssel registrieren und ihn nutzen, um zu sehen, was ich finden konnte. Ich habe eine JSL-Funktion für marvel:API geschrieben, die verschiedene Spalten verwendet, um das Marvel-Universum zu durchsuchen.
Als Deadpool-Fan habe ich eine erste Abfrage erstellt, die diese Datentabelle erstellt hat: 
Abbildung 18. „Teildatentabelle zu Deadpool.“
Dies enthüllte vier verschiedene Deadpool-Charaktere im Marvel-Comics-Universum. Mich interessierte die Identität des ersten Charakters und ich wählte den von mir erstellten Serien -Klick-Eventhandler aus. Ausgehend vom Ursprung des Klicks kann die Wunder:API- Funktion eine neue Abfrage an Marvel auslösen, deren Rückgabewert zeigt, wo Deadpool im MCU auftaucht. Ich habe die Ergebnisse auf 50 Zeilen begrenzt, konnte jedoch einige interessante Ergebnisse entdecken. Ich führte eine schnelle Verteilungsanalyse für „ Titel“ und „Startjahr“ durch, um zu sehen, wann Deadpools Popularität stieg und fiel (und wieder stieg).
Abbildung 19. „Partielle Deadpool-Verteilung.“
Abbildung 19 zeigt, dass Deadpool im Jahr 2007 in viele verschiedene Marvel-Comic-Titel aufgenommen wurde, darunter:
- Avengers: Die Initiative (2007–2010)
- Kabel & Deadpool
- Bürgerkrieg: X-Men-Universum.
Das Interesse an Deadpool ließ nach 2007 wieder nach, nahm aber (wie aus der Analyse hervorgeht) wieder zu, nachdem Ryan Reynolds die Figur zum ersten Mal in X-Men Origins: Wolverine (2009) spielte, sodass das Interesse an der Figur erneut zunahm und 2011 einen Höhepunkt erreichte.
In den Jahren 2012–2015 explodiert das Marvel-Comic-Universum in „Deadpool Kills the Marvel Universe“ für einen Marvel-Neustart.
Und schließlich: keine Überraschung für 2016–2018. Damals kamen die Filme heraus.
Peter von Deadpool 2 fasst die Marvel Comics API am besten zusammen: „Ich habe nur die Anzeige gesehen und fand, dass sie lustig aussieht.“
Verwendete Konventionen
Der Begriff RESTful-Dienst wird verwendet, wenn die Webressource REST-basiert ist
Der Begriff „Webressource“ ist ein allgemeiner Begriff, der verwendet wird, wenn allgemeiner Webzugriff gemeint ist.
HTTP-Aktionen sind fett gedruckt
Schaltflächen/Dialogfelder sind „ in Anführungszeichen gesetzt und fett gedruckt“.
Hyperlinks sind unterstrichen
JSL-Objekte und -Funktionen sind kursiv gedruckt
JSL-Variablen/Spalten/Nachrichtennamen werden „ in Anführungszeichen gesetzt und kursiv gedruckt “.
Verweise
Hawk, Sandro (16. Dezember 2011) REST abgerufen von https://www.w3.org/2001/sw/wiki/REST
W3.org -Methodendefinitionen abgerufen von https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html
W3.org Statuscodedefinitionen abgerufen https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
Mozilla.org (13. Mai 2018) HTTP-Anforderungsmethoden abgerufen von https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods
JSON.org (2017, Dezember) Einführung in JSON , abgerufen von https://www.json.org
JMP.com (12. Juli 2018) Abruf vonhttps://www.jmp.com/support/help/14/lists.shtml
JMP.com (12. Juli 2018) Arbeiten mit assoziativen Arrays, abgerufen von https://www.jmp.com/support/help/14/work-with-associative-arrays.shtml
CURL-Befehlszeilentool und Bibliothek zum Übertragen von Daten mit URLs, die von https://curl.haxx.se/ abgerufen wurden
W3.org (22. Januar 2015) Sicherung des Webs , abgerufen von https://www.w3.org/2001/tag/doc/web-https
W3.org (11. Juni 2014) HTTP – Hypertext Transfer Protocol, abgerufen von https://www.w3.org/Protocols/
Mozilla.org (2018, July 3)
Unvollständige Liste der MIME-Typen
retrieved from
https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Complete_list_of_MIME_types
PubChem.ncbi.nlm.nih.gov Informationen zu PubChem, abgerufen von https://pubchemdocs.ncbi.nlm.nih.gov/
MMs.com Zutaten abgerufen von http://www.mms.com/us/nutrition
W3Schools.com HTML-URL-Kodierungsreferenz abgerufen von https://www.w3schools.com/tags/ref_urlencode.asp
Developer.marvel.com Entwicklerportal , abgerufen von https://developer.marvel.com/