Oracle verarbeitet lange Antwort von Cryptocompare

Ich habe eine sehr individuelle Aufgabe und muss sicherstellen, welche Grenzen jede Technologie hat. Ich habe hier im Forum noch nichts vergleichbares gefunden. Ich verwende Oraclize, um eine Antwort von dieser URL zu erhalten:

https://min-api.cryptocompare.com/data/histominute?fsym=ETH&tsym=USD&limit=1&aggregate=30&e=Kraken&extraParams=your_app_name.data

und ich bekomme eine solche Antwort:

{"Antwort":"Erfolg","Typ":100,"Aggregated":true,"Data":[{"time":1536559200,"close":197,88,"high":197,99,"low":196,45 ,"open":197.71,"volumefrom":948.44,"volumeto":186888.76},{"time":1536561000,"close":199.19,"high":199.35,"low":196.68,"open":197.88 ,"volumefrom":448.02,"volumeto":88870.37}], "TimeTo":1536562560,"TimeFrom":1536559200,"FirstValueInArray":true,"ConversionType":{"type":"force_direct","conversionSymbol": ""}}

Was ich brauche, ist der "Eröffnungspreis" des ersten Array-Elements von Data, der in diesem Beispiel 197,71 beträgt, und der "Schlusspreis" des zweiten Array-Elements, der 199,19 beträgt;

Wenn ich jedoch meinen Code verwende, bekomme ich nur [] ein leeres Array oder eine leere Zeichenfolge. Hier ist der Code:

function updatePriceSingle(uint256 timeStamp) payable {
   if (oraclize_getPrice("URL") > this.balance) {
       emit LogNewOraclizeQuery("Oraclize query was NOT sent, please add some ETH to cover for the query fee");
   } else {
       emit LogNewOraclizeQuery("Oraclize query was sent, standing by for the answer..");
       oraclize_query(timeStamp, "URL", "json(https://min-api.cryptocompare.com/data/histominute?fsym=ETH&tsym=USD&limit=1&aggregate=30e=CCCAGG).Data",200000);
   }

}

und hier ist der Rückruf:

function __callback(bytes32 myid, string result) {
  if (msg.sender != oraclize_cbAddress()) revert();
  emit LogPriceUpdated(result);
}

Ich kenne eine Problemumgehung, um 2 Aufrufe json(...).Data[0] und json(...).Data[1] zu tätigen, aber ich möchte Gas sparen und in diesem Fall oben Ergebnisse von 1 Aufruf erhalten. Ist es möglich ? Vielleicht gibt es Lösungen mit "Test query" in http://app.oraclize.it/home/test_query . Vielen Dank im Voraus.

Antworten (1)

Der Grund, warum Sie ein leeres Ergebnis erhalten, ist, dass die URL einige falsche Parameter enthält, über die sich die API beschwert, à la:

{"Response":"Error","Message":"aggregate param is not an integer.","Type":1,"Aggregated":false,"Data":[]}

Ich habe die API-Dokumentation nicht gelesen, also habe ich der Schnelligkeit halber nur den beanstandeten Aggregatteil entfernt. Ich konnte die Open/Close-Schlüssel aus der Antwort analysieren, indem ich Folgendes verwendete:

json(https://min-api.cryptocompare.com/data/histominute?fsym=ETH&tsym=USD&limit=1).Data[:][open,close]

Weitere Informationen dazu finden Sie in JSONPath docs/testers. Oraclize verwendet eine bestimmte Standardversion, auf die in der Dokumentation verwiesen wird.

Here's a link to the test_query page with the above: http://app.oraclize.it/home/test_query#VVJMKEdFVCk=:anNvbihodHRwczovL21pbi1hcGkuY3J5cHRvY29tcGFyZS5jb20vZGF0YS9oaXN0b21pbnV0ZT9mc3ltPUVUSCZ0c3ltPVVTRCZsaW1pdD0xKS5EYXRhWzpdW29wZW4sY2xvc2Vd

Für komplexeres Parsing können Sie auch die Berechnungsdatenquelle verwenden, die zusätzlich verschiedene Ergebnisse verarbeiten kann, wodurch möglicherweise Berechnungskosten in der Kette eingespart werden.

das ist die Antwort, nach der ich gesucht habe!