2009-10-23 7 views
16

Quindi, vorrei sapere quanti risultati tornerò da una richiesta RICEURO uri RESTful. Non conosco alcun modo per farlo a questo punto. C'è un modo per farlo? Dato che REST getta solo le proprietà, non so se è in grado di prendere in considerazione i suoi risultati, ma può saltare i risultati e ottenere un sottoinsieme di risultati.Ottenere un conteggio dei ritorni visto da una richiesta RESTful

Qualcuno ha qualche suggerimento?

Oh il mio setup è un LINQ to SQL che popola un elenco generico queriesble. Il servizio dati rende disponibile quell'elenco. Ho provato a ottenere un conteggio sulla lista, ma ottengo sempre le file massime del database, e non è quello che sto cercando.

+5

Non so cosa si intende per la sua affermazione che "REST lancia solo proprietà." –

+0

Scusa, volevo dire che mostra solo i dati. Non è come SOAP dove puoi ottenere un risultato chiamando una funzione. Certo, puoi manipolare quei dati e modificarli in qualche modo prima di esporli, ma questo è fondamentalmente ciò che intendevo. – georryan

risposta

18

Altre persone potrebbero avere obiezioni a questo concetto, ma, questo mi sembra ragionevole:

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 

E poi:

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> 

Nota: una richiesta HEAD è qui utilizzato per ottenere il conteggio senza dover estrarre l'intero set di dati. Le richieste HEAD recuperano solo le intestazioni HTTP, non il corpo della risposta.

Questo sarebbe il modo più RESTful in cui posso pensare di indicare quanti risultati tornerai prima di inviarlo via cavo. Il trucco principale sta proprio nel trovare il miglior nome di intestazione per questo. X-Result-Count è decente, ma se riesci a trovare la tecnica antecedente e riutilizzare la scelta del nome dell'intestazione, sarebbe ancora meglio (a patto che non la chiamassero qualcosa di veramente stupido). Detto questo, non mi aspetto che avrai molta fortuna, quindi dovresti probabilmente attaccare con X-Result-Count.

Inoltre, penso che potresti aver frainteso ciò che "REST" in realtà comporta. Non c'è motivo per cui non puoi dare una rappresentazione per intervallo. Per esempio:

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> 

Tuttavia, per essere riposante, è necessario essere in grado di dire al cliente circa la rappresentazione identificato da /your/api?range=0-9 o /your/api?page=1&perpage=10 senza l'utilizzo di informazioni out-of-band. Ad esempio, se la tua pagina /your/api restituisce troppi risultati, esegui un reindirizzamento temporaneo su /your/api?page=1&perpage=10 e includi collegamenti ipertestuali a /your/api?page=2&perpage=10. Si noti che un collegamento ipertestuale in questo contesto potrebbe essere qualcosa di semplice come:

<?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> 

Ora le informazioni per navigare i risultati delle vostre chiamate API è in banda ed effettivamente RESTful.

In sostanza, REST è semplicemente HTTP vecchio con il caching fatto correttamente e gli URI di solito sensibili inseriti per buona misura. È anche "l'ipertesto come motore dello stato dell'applicazione" (vale a dire che le risorse devono essere collegate ad altre risorse). Non è un protocollo, è uno stile architettonico. Chiunque ti dica diversamente è meglio che si chiami Roy Fielding.

Addenda:

Se si desidera indicare il conteggio totale contro il numero di pagine, è possibile definire l'intestazione in questo modo:

X-Result-Count: 0-9/100000000 

Oppure regolare se necessario.

+0

Hmm, sembra che il tuo conteggio sia racchiuso nel set completo di risultati che vengono con quel conteggio, è corretto? Quindi con questo intendo che se selezionassi solo la top 10 di un set completo, il conteggio direbbe 10, e otterrei i 10 elementi insieme a quello. Quello per cui sto girando è un modo per ottenere il conteggio per una richiesta di tutti gli elementi, anche se voglio prendere piccoli set di dati completi usando (page =, top =, next =, etc). Mi piacerebbe ottenere il conteggio in modo da ottenere un numero preciso per le dimensioni delle righe necessarie per la tabella in cui verranno inserite le informazioni. Qualche idea? – georryan

+0

Inoltre, non voglio prendere tutti i dati solo per ottenere un conteggio di quanti ce ne sono. Ciò vanificherebbe lo scopo del perché ho bisogno del conteggio. – georryan

+0

@georryan Giusto, ecco perché è una richiesta HEAD. Richiesta HEAD significa che ottieni solo le intestazioni, che in questo caso includeranno il conteggio, ma non i dati. Inoltre, poiché stai definendo l'intestazione, puoi restituire i dati desiderati. –

0

Perché il servizio web REST non restituisce i dati come JSON o XML e in questo caso è possibile avere una proprietà sulla lunghezza.

+0

Non voglio ottenere tutti i risultati contemporaneamente. Sto cercando di popolare una tabella in lotti, ma voglio sapere quale sarà il conteggio totale per il set di risultati completo. – georryan

+0

Quando si effettua la richiesta iniziale si ottiene di nuovo il primo lotto e un numero totale, oppure un numero che rimane ancora. Quindi esegui il ciclo e ottieni il batch successivo, finché non avrai ottenuto tutte le informazioni. Tuttavia, il lato server ha lo stato, oppure si stanno facendo query aggiuntive al database per ottenere un numero limitato di risultati ogni volta. E cosa succede se lo stai restituendo in ordine, e sei su G, ma qualcosa che inizia con C viene inserito nel database, non sarai in grado di mostrare la nuova modifica. Oppure, ordina per ID. –

+0

Stai dicendo che la risposta xml o json avrà già una lunghezza incorporata? Dov'è? È nell'intestazione? Attualmente sto usando .net per creare il mio output RESTful, e non vedo alcun conteggio sull'output xml. – georryan

0

Si dovrebbe essere in grado di occuparsi di questo nella progettazione del nome risorsa REST. Si potrebbe iniziare con qualcosa di simile:

  • /widget di/12345 (la rappresentazione di widget di 12345)
  • /widgets (l'elenco di tutti i nomi delle risorse di widget, ovvero collegamenti)

Potrebbero decidono in fretta che "/ widgets" sarà una lista humongous e decidere di sostenere pagine, qualcosa come

  • /widgets/page/43 (questo potrebbe avere collegamenti al 4200e al 4299th widget, e informazioni aggiuntive come il totale. Numero di pagine o di un conteggio dei widget)

In altri casi si può suddividere un grande insieme in una gerarchia naturale:

  • /widgets/mogano,/widgets/quercia, ...
  • /film/dramma,/film/romanzo, ...
  • /Computer/HARD DISK/Seagate,/Computer/usbdrives/Kingston

E si può definire query troppo:

  • /widget? MAXPRICE = 200 & MaxWeight = 4
0

Perché non si fa a fare le vostre domande maniglia di risorse per quel tipo di metadati?Supponiamo che

GET /items 

restituisce l'elenco degli elementi in questo modo:

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

Poi qualcosa come:

GET /items?info 

potrebbe restituire un elenco vuoto come questo:

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

o possibilmente un documento informativo generico in questo modo:

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

Si potrebbe anche implementare una risorsa "informazioni" come questo:

GET /info?items&users 

che potrebbero tornare:

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

-1 Questo concetto non considera correttamente la memorizzazione nella cache HTTP. La combinazione di due risorse in una singola richiesta/risposta HTTP riduce le possibilità di un hit della cache. Inoltre impedisce al client di utilizzare in modo efficace 'Se modificato-Poiché' e' Ultima modifica '. Inoltre, 'Last-Modified' è il modo appropriato di restituire tali informazioni al client ed è perfettamente ragionevole farlo con una richiesta HEAD. Se si sta aprendo una singola sessione HTTP e le risorse sono migliaia (o più) di byte anziché centinaia, c'è un vantaggio molto piccolo per il batch perché la sessione stessa è un batch. –

+0

Non sono abbastanza sicuro di quello che stai dicendo qui - stai dicendo che l'uso di "GET/items" e "GET/items? Info" mette a tacere il caching? In tal caso, al posto della query "? Info", "GET/items/info" avrebbe più senso? –

+0

No, sto dicendo che restituire informazioni su entrambi gli elementi e gli utenti nella stessa risposta è sbagliato. Tenerli in richieste e risposte separate. –

Problemi correlati