Angenommen, die Daten können beliebig sein, ich sehe nicht, wie Sie die Abwesenheit von Kollisionen garantieren können, ohne die Daten zu scannen.
Wenn das Format der Daten sehr begrenzt ist (wie ... Base 64 codiert?), Können Sie möglicherweise eine Grenze auswählen, die bekanntermaßen eine unzulässige Bytefolge in diesem Format ist.
Selbst wenn Ihre Grenze tut mit den Daten kollidieren, muss sie durch Header folgen wie Content-Range
, was noch unwahrscheinlicher ist, so ist der Kunde wahrscheinlich als Fehler zu behandeln, anstatt die falschen Daten zu verbrauchen.
Große Webserver verwenden sehr einfache Strategien. Apache grabs 8 random bytes beim Start und rendert sie in Hexadezimal. Nginx verwendet a sequential counter links aufgefüllt mit Nullen.
UUIDs wurden entwickelt, um Kollisionen mit anderen UUIDs zu vermeiden, nicht mit beliebigen Daten. Eine UUID ist nicht wahrscheinlicher eine gute Grenze als eine vollständig zufällige Zeichenfolge derselben Länge. Darüber hinaus enthalten einige UUID-Varianten Informationen, die Sie möglicherweise nicht offenlegen möchten, z. B. die MAC-Adresse Ihres Geräts.
Idealerweise möchte ich einfach in der Antwort angeben, dass ein Teil eine Länge von einer bestimmten Anzahl von Bytes hat, und damit erledigt werden. Gibt es irgendwelche Werkzeuge, die mir diese Option bieten könnten?
Vielleicht können Sie vermeiden, mehrere Bereiche zu unterstützen, und den Clients einfach mitteilen, dass sie jeden Bereich einzeln anfordern sollen. In diesem Fall verwenden Sie nicht das Multipart-Format, so dass es kein Problem gibt.
Wenn Sie mehrere Bereiche in einer Antwort senden möchten, erfordert RFC 7233 das Multipart-Format, für das die Begrenzungszeichenfolge erforderlich ist.
Sie können, natürlich, erfinden Sie Ihren eigenen Mechanismus statt, dass der RFC 7233. In diesem Fall:
- Sie nicht 206 (Partial Content) verwenden können. Sie müssen 200 (OK) oder einen anderen gültigen Statuscode verwenden.
- Sie können den Medientyp nicht verwenden.Sie müssen Ihren eigenen Medientyp erstellen.
- Sie können den Anforderungskopf
Range
nicht verwenden.
- Da eine 200 (OK) Antwort auf eine Anfrage GET supposed to carry a (full) representation of the resource ist, können Sie eine der folgenden tun muss:
- kodieren die gewünschten Bereiche in der URL; oder
- verwenden Sie etwas wie POST anstelle von GET; oder
- verwenden Sie einen benutzerdefinierten, nicht standardmäßigen Statuscode statt 200 (OK); oder
- (nicht sicher, ob dies eine korrekte Vorgehensweise ist) Medientyp-Parameter verwenden, senden Sie sie in
Accept
, und Accept
zu Vary
hinzufügen.
Die chunked transfer coding nützlich sein können, aber man kann auf sie allein nicht verlassen, weil es eine Eigenschaft der Verbindung ist, nicht von der Nutzlast.
Derzeit reagiere ich mit einem 416, wenn der Client mehrere Bereiche anfordert, aber ich bin mir nicht sicher, dass es die richtige Antwort ist. Eine weitere SO-Frage ist in Ordnung, so scheint es :-P – Julik