Daten mit aschannel streamen (v2)

Aktualisierte

aschannel ist ein Streaming-Endpunkt, mit dem Clients die Ergebnisse jeder übermittelten Aufgabe in Echtzeit abrufen können, wenn sie generiert werden. Streaming-APIs unterscheiden sich von regulären APIs dadurch, dass eine Verbindung auf unbestimmte Zeit geöffnet bleibt und Nachrichten sofort nach Verfügbarkeit an den Client gesendet werden.

Kunden abonnieren ein oder mehrere Konten mit asmaster oder fordern Daten direkt über asapi an . Die Ergebnisse werden in Echtzeit an den Kunden übertragen, sobald sie verfügbar sind.

Anschließen an den Kanal

Eine Verbindung zu einem Kanal kann mit dem folgenden Befehl hergestellt werden:

$ curl \
    -X GET \
    -H "Authorization: Token <TOKEN>" \
    -d "stream=<STREAM>" \
    https://aschannel.reincubate.com/stream/

Dabei ist <TOKEN> das Token des Clients und <STREAM> die Stream-ID des Clients. Diese ID wird vom asapi- Endpunkt beim Senden einer Aufgabe bereitgestellt und ist ein konstanter Wert, der an das Token eines Clients gebunden ist.

Fehlerbehebung bei HTTP-Antwortcodes

Bei der Verbindung zu einem Kanal wird ein HTTP-Antwortcode im Antwortheader gesendet. Die folgende Tabelle beschreibt ihre Bedeutung.

Status Text Beschreibung
200 OK Alles ist gut.
400 Ungültige Anforderung Die Anfrage ist fehlerhaft.
401 Nicht autorisiert Client-Token ist ungültig.
503 Dienst nicht verfügbar aschannel ist derzeit nicht verfügbar: check status.reincubate.com

Den Stream interpretieren

Jede Nachricht von aschannel besteht aus zwei Teilen: einem Header und einer Nutzlast. Der Header enthält Metadaten zur Nachricht, während die Nutzdaten die Nachricht selbst enthalten. Dies kann eine Systemnachricht sein oder die Daten, die der Client angefordert hat. Sowohl der Header als auch die Nutzdaten enden in einem Wagenrücklauf und einer neuen Zeile, und jeder Zeile wird eine Zahl vorangestellt, die die Länge der folgenden Daten angibt.

<HEADER_LENGTH>\r\n
<HEADER>\r\n
<PAYLOAD_LENGTH>\r\n
<PAYLOAD>\r\n

Sowohl <HEADER_LENGTH> als auch <PAYLOAD_LENGTH> sind Ganzzahlen und stellen die Länge des nächsten Felds dar, einschließlich der \r\n . Der Header ist immer JSON-codiert, das Payload-Format variiert jedoch je nach Typ. Folglich könnte man Nachrichten aus dem Aschannel mit Python wie folgt konsumieren:

buf = response.raw
while not buf.closed:
    header_length = buf.readline()
    header = buf.read(header_length)
    payload_length = buf.readline()
    payload = buf.read(payload_length)

    handle_payload(header, payload)

Bei der ersten Verbindung sieht die Antwort ähnlich aus und die Verbindung bleibt geöffnet:

66
{ "type": "system",
  "id": "cff35e74-c709-4374-348e-03ea9a2cee61"}
45
{ "message": "Message streaming has begun."}

Hier sind 66 und 45 die Kopflänge bzw. Nutzlastlänge. Wenn Sie sich mit demselben Schlüssel von einem anderen Terminal aus erneut verbinden, erhalten Sie Folgendes:

66
{ "type": "system",
  "id": "ad17c5a5-c658-4736-876e-cf7901be7292"}
155
{ "message": "A new HTTP connection has been opened using your your authentication details, culling old connections.",
  "error": "CULLING_OLD_CONNECTIONS"
}

Chunked Payloads interpretieren

Jede Nutzlast, die größer als einige Kilobyte ist, wird in kleinere Blöcke aufgeteilt, die ein Client neu zusammensetzen muss, um die ursprüngliche Nutzlast zu bilden. Header enthalten Felder mit den Namen chunk , total_chunks und chunk_size . Diese Header können auch dann vorhanden sein, wenn nur ein einziger Block vorhanden ist.

Ein aufgeschlüsseltes Ergebnis für eine login würde beispielsweise die folgende Ausgabe ergeben:

123
{ "chunk": 1,
  "total_chunks": 1,
  "type": "log-in",
  "task_id": "2a24db6c-6870-4a27-a45a-a5c172d8ec98",
  "chunk_size": 16384
}
51
{ "message": "Log-in successful",
  "success": true
}

Aufgabenergebnisse empfangen

Das Folgende ist ein Beispiel für eine Nachrichtenantwort von einer fetch_data Task im icloud Dienst:

137
{ "stream": "<STREAM>",
  "task_id": "<TASK_ID>",
  "chunk": 1,
  "total_chunks": 1,
  "chunk_size": 16384,
  "type": "<PAYLOAD_TYPE>"
}
288
{ "sms": [{
    "conversation_id": "+447910000000",
    "from_me": false,
    "handle": "vodafone",
    "attachments": [],
    "deleted": false,
    "type": "SMS",
    "date": "2016-09-16 11:52:53.000000",
    "text": "Welcome to Vodafone!",
    "group_handles": null,
    "id": 1
  }]
}

Hier ist die <TASK_ID> dieselbe <TASK_ID> die von asapi bei der <TASK_ID> der Aufgabe angegeben wurde. Der <PAYLOAD_TYPE> beschreibt die Art der Nutzlast und wird anhand des slug der über asapi übermittelten Aktion beschrieben.

Empfangen von Systemnachrichten

Von Zeit zu Zeit muss ricloud möglicherweise Systemnachrichten an den Client senden. Diese werden immer von den Header identifiziert type Feld gesetzt wird system . Zum Beispiel:

16
{ "type": "system"
}
97
{ "code": "client-too-slow",
  "message": "The client is reading data too slowly. Disconnecting."
}

Die folgende Systemmeldung code Werte sind möglich:

Antwort Zusammenfassung
reconnect Erneute Verbindung erforderlich
CULLING_OLD_CONNECTIONS Gleichzeitige Verbindung
WARNING_SLOW_CONNECTION Pufferwarnung
CLOSING_SLOW_CONNECTION Client zu langsam

Erneute Verbindung erforderlich

Der Kanal kann den Client anweisen, die Verbindung wiederherzustellen. In diesem Fall sollte der Client so bald wie möglich eine neue Verbindung zum angegebenen Endpunkt herstellen.

Gleichzeitige Verbindung

Der Kanal erlaubt nur eine einzige offene Verbindung pro Client. Wenn ein Client eine neue Verbindung öffnet, wird die alte mit dieser Nachricht beendet.

Pufferwarnung

Clients können getrennt werden, wenn sie keine Nachrichten mit der angegebenen Rate empfangen. Sie werden gewarnt, wenn sie ins Hintertreffen geraten, beginnend, wenn der interne Puffer einen vordefinierten Schwellenwert von 40% ihrer für sie gehaltenen Nachrichten erreicht.

Client zu langsam

Diese Nachricht wird gesendet, wenn die Verbindung beendet wird, wenn der Nachrichtenverbrauch zu langsam ist.

Wenn der Client einen Rückstand an Aufgaben hat und Nachrichten schnell verbraucht, besteht die Gefahr, dass die Verbindung wiederholt unterbrochen wird und viele oder alle Aufgabenergebnisse verloren gehen. Sobald ein Client erneut eine Verbindung herstellt, werden nur die Ergebnisse von Aufgaben übertragen, die nach dem Trennen der Verbindung abgeschlossen wurden.

Wie können wir helfen?

Unser Support-Team hilft Ihnen gerne weiter!

Unsere Bürozeiten sind Montag bis Freitag von 9 bis 17 Uhr GMT. Die Zeit ist aktuell 8:02 vorm. GMT.

Wir bemühen uns, auf alle Mitteilungen innerhalb eines Arbeitstages zu antworten.

Zum Support-Bereich gehen › Wenden Sie sich an das Unternehmensteam ›
Unser großartiges Supportteam

© 2008 - 2019 Reincubate Ltd. Alle Rechte vorbehalten. Registriert in England und Wales #5189175, VAT GB151788978. Reincubate® ist eine eingetragene Marke. Datenschutz. Wir empfehlen die Multi-Faktor-Authentifizierung. Mit Liebe in London gebaut.