2009-10-23 10 views
16

Chciałbym wiedzieć, ile wyników otrzymam z prośby o przywrócenie usługi URI GET. Nie wiem, jak to zrobić w tym momencie. Czy jest jakiś sposób na zrobienie tego? Ponieważ REST po prostu wyrzuca właściwości, nie wiem, czy jest w stanie policzyć jego wyniki, ale może pominąć wyniki i pobrać podzbiór wyników.Uzyskiwanie liczby zwrotów widzianych przez żądanie RESTful

Ktoś ma jakieś sugestie?

Moja konfiguracja to LINQ do SQL, który zapełnia listę odpowiadającą danemu dostawcy. Usługa danych udostępnia tę listę. Próbowałem już liczyć na liście, ale zawsze otrzymuję z powrotem maks. Wiersze bazy danych, a to nie jest to, czego szukam.

+5

Nie wiem co masz na myśli przez twierdzenie że "REST po prostu wyrzuca właściwości". –

+0

Przepraszam, chodzi mi o to, że po prostu ujawnia dane. To nie jest tak, jak SOAP, gdzie można uzyskać wynik, wywołując funkcję. To prawda, możesz manipulować danymi i zmienić je w pewnym stopniu, zanim je wyeksponujesz, ale w zasadzie to właśnie miałem na myśli. – georryan

Odpowiedz

18

Inni ludzie mogą mieć zastrzeżenia do tej koncepcji, ale to wydaje się rozsądne, aby mnie:

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 

, a następnie:

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> 

Uwaga: Żądanie HEAD jest tutaj stosowane do uzyskania licznik bez konieczności ciągnięcia pełnego zestawu danych. Żądania HEAD pobierają tylko nagłówki HTTP, a nie treść odpowiedzi.

To byłoby najbardziej relaksującego sposób mogę myśleć co wskazuje ile wyniki dostaniesz z powrotem przed wysłaniem go na drucie. Główna sztuczka polega właśnie na wymyśleniu najlepszej nazwy nagłówka. X-Result-Count jest przyzwoity, ale jeśli uda Ci się znaleźć wcześniejsze wersje i ponownie użyć ich nazwy nagłówka, to będzie jeszcze lepiej (o ile nie nazwali tego czymś naprawdę niemym). Powiedział, że nie oczekuję, że będziesz miał dużo szczęścia, więc powinieneś prawdopodobnie trzymać się z X-Result-Count.

Sądzę też, że źle zrozumiałeś, co właściwie oznacza "REST". Nie ma powodu, dla którego nie można podać reprezentacji według zasięgu. Na przykład:

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> 

Jednakże, aby być relaksującego, trzeba być w stanie powiedzieć klienta o przedstawienie zidentyfikowanego przez /your/api?range=0-9 lub /your/api?page=1&perpage=10 bez użycia out-of-band informacji. Na przykład, jeśli twoja strona /your/api zwróci zbyt wiele wyników, zrób tymczasowe przekierowanie do /your/api?page=1&perpage=10 i dołącz hiperłącza do /your/api?page=2&perpage=10. Zauważ, że hiperłącze w tym kontekście może być coś prostego jak:

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

Teraz informacja nawigować wyniki swoich API jest w paśmie i rzeczywiście spokojny.

Zasadniczo REST jest zwykły stary HTTP z buforowania zrobione dobrze i zazwyczaj rozsądne URI rzucony w środek na dobre. Jest to również "hipertekst jako motor stanu aplikacji" (tzn. Zasoby powinny łączyć się z innymi zasobami). To nie jest protokół, to styl architektoniczny. Każdy, kto mówi ci inaczej, powinien być lepiej nazwany Roy Fielding.

Addenda:

Jeśli chcesz podać całkowitą liczbę w stosunku do liczby stron, można zdefiniować nagłówek tak:

X-Result-Count: 0-9/100000000 

Lub wyreguluj w razie potrzeby.

+0

Hmm, wygląda na to, że twój licznik jest wskoczony do pełnego zestawu wyników, które pochodzą z tej liczby, czy to prawda? Więc mam na myśli to, że jeśli wybieram tylko 10 najlepszych z pełnego zestawu, liczba będzie wynosić 10, a ja dostanę 10 elementów wraz z tym. To, co robię, to sposób na liczenie żądań wszystkich przedmiotów, mimo że chcę pobrać małe zestawy pełnych danych za pomocą (page =, top =, next =, etc). Chciałbym uzyskać obliczenie, aby uzyskać dokładną liczbę wierszy potrzebnych do tabeli, do której będą pasowały informacje. Jakieś pomysły? – georryan

+0

Nie chcę też pobierać wszystkich danych tylko po to, aby sprawdzić, ile ich jest. To pokonałoby cel, dlaczego potrzebuję hrabiego. – georryan

+0

@georryan Właśnie, dlatego jest to żądanie HEAD. Żądanie HEAD oznacza, że ​​otrzymujesz tylko nagłówki, które w tym przypadku będą zawierać liczbę, ale nie dane. Ponadto, ponieważ definiujesz nagłówek, możesz zwrócić dowolne dane. –

0

Dlaczego nie mają usługa REST tylko zwrócić dane jako JSON lub XML, a tam można mieć właściwość o długości.

+0

Nie chcę uzyskać wszystkich wyników na raz. Próbuję wypełnić tabelę partiami, ale chcę wiedzieć, jaka będzie całkowita liczba dla pełnego zestawu wyników. – georryan

+0

Po otrzymaniu pierwszego żądania otrzymasz pierwszą partię i całkowitą liczbę lub liczbę, która wciąż pozostaje. Następnie przechodzisz przez pętlę i otrzymujesz kolejną partię, aż uzyskasz wszystkie informacje. Ale albo po stronie serwera jest stanowy, albo robisz dodatkowe zapytania do bazy danych, aby uzyskać ograniczoną liczbę wyników za każdym razem. A co się stanie, jeśli zwrócisz je z powrotem posortowane i będziesz na G, ale coś, co zaczyna się na C, zostanie wstawione do bazy danych, nie będziesz w stanie pokazać nowej zmiany. Lub po prostu sortuj według identyfikatora. –

+0

Mówisz, że odpowiedź xml lub json będzie już w niej osadzona? Gdzie to jest? Czy to jest w nagłówku? Używam faktycznie .net do tworzenia moich wyników RESTful i nie widzę żadnej liczby na wyjściach xml. – georryan

0

Powinieneś być w stanie zająć się tym w swoim projekcie nazwy zasobów REST. Można by zacząć od czegoś podobnego:

  • /widget/12345 (reprezentacji widget 12345)
  • /widgets (wykaz wszystkich nazw zasobów widgetów, czyli linki)

Mógłbyś szybko zdecydować, że "/ widgets" będzie listę humongous i decydują się wspierać stron, coś jak

  • /widgets/page/43 (to może mieć powiązania z 4200th do 4299th widgetów, a dodatkowe informacje, takie jak sumy . Liczba stron lub liczba widżetów)

W innych przypadkach można podzielić duży zestaw do naturalnej hierarchii:

  • /widgety/mahoń, dąb/widgety/...
  • /filmy/dramat/filmy/romans ...
  • /Komputery/dyski twarde/Seagate/Komputery/USBdrives/Kingston

można zdefiniować zapytań też:

  • /widżety? Maxprice = 200 & maxweight = 4
0

Dlaczego nie można dokonać zasobów zapytania uchwyt do tego rodzaju metadane?Załóżmy, że

GET /items 

zwraca listę elementów takiego:

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

Wtedy coś takiego:

GET /items?info 

może powrócić pustą listę tak:

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

lub ewentualnie ogólny dokument informacyjny tak:

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

Można również wdrożyć "info" zasobu takiego:

GET /info?items&users 

które mogłyby powrotu:

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

-1 Ta koncepcja nie uwzględnia poprawnie buforowania HTTP. Łączenie dwóch zasobów w jedno żądanie/odpowiedź HTTP zmniejsza szanse na trafienie w pamięci podręcznej. Zapobiega to również korzystaniu przez klienta z funkcji "If-Modified-Since" i "Last-Modified". Ponadto "Last-Modified" jest właściwym sposobem zwracania tej informacji do klienta i jest to całkowicie uzasadnione, aby zrobić to za pomocą żądania HEAD. Jeśli otwierasz pojedynczą sesję HTTP, a zasoby to tysiące (lub więcej) bajtów, a nie setek, jest bardzo mało korzyści z grupowania, ponieważ sama sesja to partia. –

+0

Nie jestem do końca pewien, co mówisz tutaj - czy mówisz, że używając "GET/items" i "GET/items? Info" wkręcasz buforowanie? Jeśli tak, to zamiast zapytania "? Info", "GET/items/info" miałoby więcej sensu? –

+0

Nie, mówię, że zwracanie informacji o obu produktach i użytkownikach w tej samej odpowiedzi jest złe. Zachowaj je w osobnych żądaniach i odpowiedziach. –

Powiązane problemy