0

REST Call Ergebnis auswerten

Hallo,

zunächst mal Danke an Ninox für diese geniale Applikation, die das Entwickeln maßgeschneiderter (Teamwork-)Lösungen für Jeden möglich macht. Großes Kompliment dafür!

Mein Anliegen: Mit dem REST call komme ich nicht weiter. Aus den Einträgen im Forum entnehme ich, dass das Ergebnis derzeit als nicht auswertbares Array gespeichert wird... (?)

Gibt es eine Möglichkeit, auf den Text der Antwort direkt zuzugreifen, sodass ich mir die gewünschte Information selbst herausparsen kann?

Dies ist die Information, die ich abfrage: https://sdw-wsrest.ecb.europa.eu/service/data/EXR/D.CHF.EUR.SP00.A?startPeriod=2018-05-09&endPeriod=2018-05-09

Danke & viele Grüße!

4 Antworten

null
    • Gunther
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Ja, das geht. Du musst die Response als Textfeld umwandeln. Dann kann den Rest selber parsen.

    Muster: 

    let Response := http(Methode, Url, Header, Body);
    Antwort := text(Response);

    • Christoph_Gillessen
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Hallo Günter, 

    danke für deine Antwort! Am Ziel bin ich allerdings noch nicht - text(Response) liefert stets den folgenden String:

    {"result":{"location":null}}

    Folgende Aufgabe: Ich möchte automatisch bzw. auf Knopfdruck tagesaktuelle Umrechnungskurse über den REST Service der EZB abrufen. Dokumentation des Service: 

    https://sdw-wsrest.ecb.europa.eu/web/generator/index.html

    Über folgendes Skript generiere ich die Abfrage:

    let myHeader := "";
    let myBody := "";
    let myRequest := "https://sdw-wsrest.ecb.europa.eu/service/data/EXR/D." + 'Zielwährung'.'Kürzel' + "." + 'Quellwährung'.'Kürzel' + ".SP00.A?startPeriod=" + format(Datum, "YYYY-MM-DD") + "&endPeriod=" + format(Datum, "YYYY-MM-DD");
    let myResponse := http("get", myRequest, myHeader, myBody);

    (Ich muss gestehen, dass ich keine Ahnung habe, wofür und wie die Attribute Header und Body in der Funktion http() verwendet werden - darüber habe ich leider nichts gefunden im Forum oder im Handbuch.)

    Der resultierende URL sieht z.B. so aus: 

    https://sdw-wsrest.ecb.europa.eu/service/data/EXR/D.CHF.EUR.SP00.A?startPeriod=2018-05-16&endPeriod=2018-05-16

    Wenn ich dies im Browser eingebe, wird eine Datei mit Namen D.CHF.EUR.SP00.A heruntergeladen, die ich mit einem Texteditor öffnen kann. Der Inhalt sieht für die o.a. Abfrage so aus:

    <?xml version="1.0" encoding="UTF-8"?><message:GenericData xmlns:message="http://www.sdmx.org/resources/sdmxml/schemas/v2_1/message" xmlns:common="http://www.sdmx.org/resources/sdmxml/schemas/v2_1/common" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:generic="http://www.sdmx.org/resources/sdmxml/schemas/v2_1/data/generic" xsi:schemaLocation="http://www.sdmx.org/resources/sdmxml/schemas/v2_1/message https://sdw-wsrest.ecb.europa.eu:443/vocabulary/sdmx/2_1/SDMXMessage.xsd http://www.sdmx.org/resources/sdmxml/schemas/v2_1/common https://sdw-wsrest.ecb.europa.eu:443/vocabulary/sdmx/2_1/SDMXCommon.xsd http://www.sdmx.org/resources/sdmxml/schemas/v2_1/data/generic https://sdw-wsrest.ecb.europa.eu:443/vocabulary/sdmx/2_1/SDMXDataGeneric.xsd">
    <message:Header>
    <message:ID>7f7e587b-e34a-44e3-b6b2-5592500737b8</message:ID>
    <message:Test>false</message:Test>
    <message:Prepared>2018-05-16T23:02:45.276+02:00</message:Prepared>
    <message:Sender id="ECB"/>
    <message:Structure structureID="ECB_EXR1" dimensionAtObservation="TIME_PERIOD">
    <common:Structure>
    <URN>urn:sdmx:org.sdmx.infomodel.datastructure.DataStructure=ECB:ECB_EXR1(1.0)</URN>
    </common:Structure>
    </message:Structure>
    </message:Header>
    <message:DataSet action="Replace" validFromDate="2018-05-16T23:02:45.276+02:00" structureRef="ECB_EXR1">
    <generic:Series>
    <generic:SeriesKey>
    <generic:Value id="FREQ" value="D"/>
    <generic:Value id="CURRENCY" value="CHF"/>
    <generic:Value id="CURRENCY_DENOM" value="EUR"/>
    <generic:Value id="EXR_TYPE" value="SP00"/>
    <generic:Value id="EXR_SUFFIX" value="A"/>
    </generic:SeriesKey>
    <generic:Attributes>
    <generic:Value id="TITLE_COMPL" value="ECB reference exchange rate, Swiss franc/Euro, 2:15 pm (C.E.T.)"/>
    <generic:Value id="SOURCE_AGENCY" value="4F0"/>
    <generic:Value id="UNIT_MULT" value="0"/>
    <generic:Value id="DECIMALS" value="4"/>
    <generic:Value id="UNIT" value="CHF"/>
    <generic:Value id="COLLECTION" value="A"/>
    <generic:Value id="TITLE" value="Swiss franc/Euro"/>
    </generic:Attributes>
    <generic:Obs>
    <generic:ObsDimension value="2018-05-16"/>
    <generic:ObsValue value="1.1792"/>
    <generic:Attributes>
    <generic:Value id="OBS_STATUS" value="A"/>
    <generic:Value id="OBS_CONF" value="F"/>
    </generic:Attributes>
    </generic:Obs>
    </generic:Series>
    </message:DataSet>
    </message:GenericData>

    Günters Antwort folgend, hätte ich erwartet, dass dieser Text zu sehen ist, wenn ich myAntwort := text(myResponse); ausführe und mir den inhalt von myAntwort anschaue. Stattdessen enthält das Textfeld nur den String

    {"result":{"location":null}}

    Frage: Wie muss ich den REST Service aufrufen und die Antwort auswerten/umwandeln, um ein verwertbares Ergebnis zu erhalten (kann gerne einfach nur der Text sein, damit ich das Attribut ObsValue herausparsen kann)?

    Danke!

    • Christoph_Gillessen
    • vor 6 Jahren
    • Gemeldet - anzeigen

    So, jetzt habe ich es doch noch hinbekommen. Muss mich als technischer Laie outen: Mir ist erst jetzt der kardinale Unterschied zwischen JSON und XML response bewusst geworden... Der EZB Service wird mit http() nicht funktionieren, da http() JSON als Antwortformat erwartet und EZB XML liefert (Erleuchtung!).

     

    Dies berücksichtigend, habe ich einen anderen Service gefunden, der Umrechnungskurse kostenfrei als JSON liefert:

    https://free.currencyconverterapi.com (Dokumentation)

    Die Auswertung sieht dann aus wie folgt:

     

    let myRequest := "https://free.currencyconverterapi.com/api/v5/convert?q=" + 'Quellwährung'.'Kürzel' + "_" + 'Zielwährung'.'Kürzel' + "&compact=ultra&date=" + format(Datum, "YYYY-MM-DD");
    let myResponse := text(http("GET", myRequest));
    Umrechnungsfaktor := number(extractx(myResponse, "[0-9]+\.[0-9]+"))

     

    Danke auch an ca.de@kabelmail.de für den Tutorial-Tipp bzgl. regulärer Ausdrücke!

    • Gunther
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Na prima. Es gibt auch Tools die xml in JSON umwandeln.

    Aber die jetzige Lösung ist natürlich besser.

Content aside

  • vor 6 JahrenZuletzt aktiv
  • 4Antworten
  • 3340Ansichten