Ich versuche, den Austausch in Ripple zu bekommen und ich fand this data API und seine Arbeit. Aber ich möchte das wellig websocket Werkzeug aus einigen Gründen verwenden. Gibt es für diese Daten-API ein Websocket-Äquivalent?Ripple exchanges websocket äquivalent für welligkeit daten apiv2
Antwort
Ich denke, es gibt Entsprechung, wenn Sie "tx_history" -Befehl im Socket verwenden, aber Sorry, Ihnen zu sagen, dass das Json-Ergebnis nicht mit Ihrem spezifischen Datenergebnis übereinstimmen.
Ripple Daten Apiv2 wird von Ajax gespielt. Das Ergebnis sehen json Formatierer in Welligkeit für den Austausch:
} else if (resp.rows.length) { resp.rows[0] = { base_currency: resp.rows[0].base_currency, base_issuer: resp.rows[0].base_issuer, base_amount: resp.rows[0].base_amount, counter_amount: resp.rows[0].counter_amount, counter_currency: resp.rows[0].counter_currency, counter_issuer: resp.rows[0].counter_issuer, rate: resp.rows[0].rate, executed_time: resp.rows[0].executed_time, ledger_index: resp.rows[0].ledger_index, buyer: resp.rows[0].buyer, seller: resp.rows[0].seller, taker: resp.rows[0].taker, provider: resp.rows[0].provider, autobridged_currency: resp.rows[0].autobridged_currency, autobridged_issuer: resp.rows[0].autobridged_issuer, offer_sequence: resp.rows[0].offer_sequence, tx_type: resp.rows[0].tx_type, tx_index: resp.rows[0].tx_index, node_index: resp.rows[0].node_index, tx_hash: resp.rows[0].tx_hash }; } res.csv(resp.rows, filename); } else { res.json({ result: 'success', count: resp.rows.length, marker: resp.marker, exchanges: resp.rows }); } }
und es kann nur den Zugriff durch get url sein:
Route: ‚/ v2/Börsen/{: base}/{: counter}‘
, die dort server.js binden wird:
app.get ('/ v2/exchanges /: base /: counter', routes.getExchanges);
und letzter Hinweis ist dies ihre Datenbankabfrage mit hbase:
HbaseClient.getExchanges = function (Optionen, Rückruf) {
var base = options.base.currency + '|' + (options.base.issuer || ''); var counter = options.counter.currency + '|' + (options.counter.issuer || ''); var Tabelle; var keyBase; var startRow; var endRow;var absteigend;
var-Spalten;
if (counter.toLowerCase()> base.toLowerCase()) { keyBase = Basis + '|' + Zähler;
} sonst { keyBase = Zähler + '|' + Basis; options.invert = wahr; }
if (! Options.interval) { table = 'Austausch'; absteigend = Optionen.absteigend? wahr falsch; options.unreduced = true;
//only need certain columns if (options.reduce) { columns = [ 'd:base_amount', 'd:counter_amount', 'd:rate', 'f:executed_time', 'f:buyer', 'f:seller', 'f:taker' ]; }
} else if (exchangeIntervals.indexOf (options.interval) == -1!) { keyBase = options.interval + '|' + SchlüsselBase; absteigend = Optionen.absteigend? wahr falsch; Tabelle = 'agg_exchanges';
} else { Rückruf ('ungültiges Intervall:' + Optionen.Intervall); Rückkehr; }
startRow = keyBase + '|' + Optionen.start.hbaseFormatStartRow();
endRow = keyBase + '|' + Optionen.end.hbaseFormatStopRow();if (options.autobridged) { options.filterstring = "DependentColumnFilter ('f', 'autobridged_currency')"; if (Spalten) { columns.push ('f: autobridged_currency'); }}
this.getScanWithMarker (this, { Tisch: Tisch, startRow: startRow, stopRow: bisZei, Marker: options.marker, Grenze: options.limit, absteigend: absteigend, Spalten : Spalten, Filterstring: options.filterstring}, Funktion (err bzw.) {
if (!resp) { resp = {rows: []}; } if (!resp.rows) { resp.rows = []; } if (options.reduce && options.unreduced) { if (descending) { resp.rows.reverse(); } resp.reduced = reduce(resp.rows); } else if (table === 'exchanges') { resp.rows = formatExchanges(resp.rows); } else { resp.rows = formatAggregates(resp.rows); } callback(err, resp); });
/** * formatExchanges */
formatExchanges Funktion (Zeilen) { rows.forEach (function (row) { var key = row.rowkey.split ('|');
delete row.base_issuer; delete row.base_currency; delete row.counter_issuer; delete row.counter_currency; row.base_amount = parseFloat(row.base_amount); row.counter_amount = parseFloat(row.counter_amount); row.rate = parseFloat(row.rate); row.offer_sequence = Number(row.offer_sequence || 0); row.ledger_index = Number(row.ledger_index); row.tx_index = Number(key[6]); row.node_index = Number(key[7]); row.time = utils.unformatTime(key[4]).unix(); }); if (options.invert) { rows = invertPair(rows); } return rows; }
/** * * formatAggregates/
formatAggregates Funktion (Zeilen) { rows.forEach (function (row) { var key = row.rowkey.split ('| ‚); row.base_volume = parseFloat (row.base_volume), row.counter_volume = parseFloat (row.counter_volume), row.buy_volume = parseFloat (row.buy_volume), row.count = Number (row.count) ; ro w.open = parseFloat (row.open); row.high = parseFloat (row.high); row.low = parseFloat (row.low); row.close = parseFloat (row.close); row.vwap = parseFloat (row.vwap); row.close_time = Nummer (row.close_time); row.open_time = Nummer (row.open_time); });
if (options.invert) { rows = invertPair(rows); } return rows; }
/** *, wenn die Basis/Zähler-Taste invertiert wurde, wir * einige der Werte in den Ergebnissen */
Funktion invertPair (Zeilen) tauschen müssen { var Wechsel; var i;
if (options.unreduced) { for (i=0; i<rows.length; i++) { rows[i].rate = 1/rows[i].rate; //swap base and counter vol swap = rows[i].base_amount; rows[i].base_amount = rows[i].counter_amount; rows[i].counter_amount = swap; //swap buyer and seller swap = rows[i].buyer; rows[i].buyer = rows[i].seller; rows[i].seller = swap; } } else { for (i=0; i<rows.length; i++) { //swap base and counter vol swap = rows[i].base_volume; rows[i].base_volume = rows[i].counter_volume; rows[i].counter_volume = swap; //swap high and low swap = 1/rows[i].high; rows[i].high = 1/rows[i].low; rows[i].low = swap; //invert open, close, vwap rows[i].open = 1/rows[i].open; rows[i].close = 1/rows[i].close; rows[i].vwap = 1/rows[i].vwap; //invert buy_volume rows[i].buy_volume /= rows[i].vwap; } } return rows; }
/** * * reduzieren reduzieren alle Zeilen */
Funktion reduzieren (Zeilen) {
var buyVolume = 0; var reduced = { open: 0, high: 0, low: Infinity, close: 0, base_volume: 0, counter_volume: 0, buy_volume: 0, count: 0, open_time: 0, close_time: 0 }; rows = formatExchanges(rows);
// filter out small XRP amounts
rows = Zeilen. Filter (Funktion (Zeile) { if (options.base.currency === 'XRP' & & Zeile.base_amount < 0,0005) { Rückgabe false; } sonst if (options.counter.currency === 'XRP' & & row.counter_amount < 0,0005) { Rückgabe false; } sonst { Rückkehr wahr; } });
if (rows.length) { reduced.open_time = moment.unix(rows[0].time).utc().format(); reduced.close_time = moment.unix(rows[rows.length-1].time).utc().format(); reduced.open = rows[0].rate; reduced.close = rows[rows.length -1].rate; reduced.count = rows.length; } else { reduced.low = 0; return reduced; } rows.forEach(function(row) { reduced.base_volume += row.base_amount; reduced.counter_volume += row.counter_amount; if (row.rate < reduced.low) reduced.low = row.rate; if (row.rate > reduced.high) reduced.high = row.rate; if (row.buyer === row.taker) { reduced.buy_volume += row.base_amount; } }); reduced.vwap = reduced.counter_volume/reduced.base_volume; return reduced; } };
Vielleicht sollten Sie eine benutzerdefinierte websocket machen, die Ihren RPC
Anruf Upgrade auf 1.1 HTTP-Protokoll (ws) zu machen.
In nodejs
können Sie einfach
// for http
var http = require('http');
// for websocket
var ws = require("nodejs-websocket")
var options = {
host: 'URL-RPC-HERE',
port: '80',
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': post_data.length
}
};
var req = http.request(options, function(res) {
// after getting the response wich is the <res>
// we can upgrade it to ws
upToWebsocket(res);
});
//Upgrade to websocket
var upToWebsocket = function(json) {
var server = ws.createServer(function (conn) {
conn.on("json", function (str) {
conn.sendText(str.toUpperCase()+"!!!")
})
conn.on("close", function (code, reason) {
console.log("Connection closed")
})
}).listen(8001)
}
Und auch, wenn Sie auf einem Server Wellenförmig laufen haben dies nicht hilft, weil es keine RPC oder WS ist, die Exchange-API unterstützt.