Abrufen einer Anzahl von Rückgaben, die von einer RESTful-Anforderung gesehen werden

entity-framework rest

Frage

Daher würde ich gerne wissen, wie viele Ergebnisse ich von einer RESTful uri GET-Anfrage erhalten werde. Ich kenne zu diesem Zeitpunkt keine Möglichkeit, dies zu tun. Gibt es eine Möglichkeit, dies zu tun? Da REST nur Eigenschaften auswirft, weiß ich nicht, ob es in der Lage ist, die Ergebnisse zu zählen, aber es kann die Ergebnisse überspringen und eine Teilmenge der Ergebnisse aufnehmen.

Hat jemand Anregungen?

Oh mein Setup ist ein LINQ to SQL, das eine abfragbare generische Liste enthält. Der Datendienst stellt diese Liste zur Verfügung. Ich habe versucht, eine Zählung in der Liste abzurufen, aber ich bekomme immer die maximalen Zeilen der Datenbank zurück, und das ist nicht das, wonach ich suche.

Akzeptierte Antwort

Andere Leute mögen Einwände gegen dieses Konzept haben, aber das erscheint mir vernünftig:

HEAD /your/api HTTP/1.1

HTTP/1.1 200 OK
Date: Fri, 23 Oct 2009 00:58:17 GMT
Content-Type: application/xml; charset=UTF-8
Content-Length: 89
X-Result-Count: 100000000

Und dann:

GET /your/api HTTP/1.1

HTTP/1.1 200 OK
Date: Fri, 23 Oct 2009 00:58:17 GMT
Content-Type: application/xml; charset=UTF-8
Content-Length: 89
X-Result-Count: 100000000

<?xml version="1.0" encoding="UTF-8"?>
<results>
  100000000 results go here.
</results>

Hinweis: Eine HEAD-Anforderung wird hier verwendet, um die Anzahl zu ermitteln, ohne den vollständigen Datensatz abzurufen. HEAD-Anforderungen rufen nur die HTTP-Header ab, nicht den Hauptteil der Antwort.

Dies ist die REST-fähigste Methode, um anzugeben, wie viele Ergebnisse Sie zurückbekommen, bevor Sie es über den Draht schicken. Der Haupttrick besteht darin, den besten Namen für die Kopfzeile anzugeben. X-Result-Count ist anständig, aber wenn Sie den Stand der Technik finden und die Auswahl des Headernamens wiederverwenden können, wäre dies sogar noch besser (sofern sie nicht als etwas wirklich Dummes bezeichnet werden). Das heißt, ich erwarte nicht, dass Sie viel Glück haben werden, also sollten Sie wahrscheinlich bei X-Result-Count bleiben.

Ich denke, Sie haben möglicherweise falsch verstanden, was "REST" tatsächlich bedeutet. Es gibt keinen Grund, warum Sie keine Darstellung nach Reichweite geben können. Zum Beispiel:

GET /your/api?page=1&perpage=10 HTTP/1.1

HTTP/1.1 200 OK
Date: Fri, 23 Oct 2009 00:58:17 GMT
Content-Type: application/xml; charset=UTF-8
Content-Length: 101
X-Result-Count: 10

<?xml version="1.0" encoding="UTF-8"?>
<results>
  First 10 results of 100000000 go here.
</results>

Um jedoch REST-fähig zu sein, müssen Sie in der Lage sein, dem Client die Repräsentation mitzuteilen, die in /your/api?range=0-9 oder /your/api?page=1&perpage=10 ohne Out-of-Band-Informationen zu verwenden. Wenn Ihre /your/api Seite beispielsweise zu viele Ergebnisse /your/api?page=1&perpage=10 , führen Sie eine temporäre Weiterleitung zu /your/api?page=1&perpage=10 durch und /your/api?page=1&perpage=10 Hyperlinks zu /your/api?page=2&perpage=10 . Beachten Sie, dass ein Hyperlink in diesem Kontext einfach sein kann:

<?xml version="1.0" encoding="UTF-8"?>
<results>
  <result>
    This is a result.
  </result>
  <result>
    This is also a result.
  </result>
  <link rel="next" href="/your/api?page=3&perpage=2" />
  <link rel="prev" href="/your/api?page=1&perpage=2" />
</results>

Die Informationen zum Navigieren in den Ergebnissen Ihrer API-Aufrufe sind jetzt bandintern und tatsächlich RESTful.

Im Wesentlichen handelt es sich bei REST um einfaches, altes HTTP, wobei das Caching richtig ausgeführt wird und normalerweise vernünftige URIs für ein gutes Maß eingefügt werden. Es ist auch "Hypertext als Engine des Anwendungsstatus" (dh Ressourcen sollten mit anderen Ressourcen verknüpft sein). Es ist kein Protokoll, sondern ein Architekturstil. Jeder, der Ihnen etwas anderes erzählt, sollte besser Roy Fielding heißen.

Zusätze:

Wenn Sie die Gesamtzahl gegenüber der Seitenanzahl angeben möchten, können Sie die Kopfzeile wie folgt definieren:

X-Result-Count: 0-9/100000000

Oder nach Bedarf anpassen.


Beliebte Antwort

Warum veranlassen Sie nicht, dass Ihre Ressource Abfragen für diese Art von Metadaten verarbeitet? Nehme an, dass

GET /items

gibt Ihre Liste der Elemente wie folgt zurück:

<items count="5" modified="2009-10-22">
  <item url="/items/first" name="First Item" />
  <item url="/items/second" name="Second Item" />
  ...
</items>

Dann so etwas wie:

GET /items?info

könnte eine leere Liste wie folgt zurückgeben:

<items count="5" modified="2009-10-22" type="info" />

oder möglicherweise ein allgemeines Infodokument wie folgt:

<info>
  <items count="5" modified="2009-10-22" url="/items" />
</info>

Sie könnten auch eine "Info" -Ressource wie folgt implementieren:

GET /info?items&users

was könnte zurückkehren:

<info>
  <items count="5" modified="2009-10-22" url="/items" />
  <users count="8" modified="2009-10-05" url="/users" />
</info>


Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum