獲取RESTful請求所看到的返回計數

entity-framework rest

所以,我想知道我將從RESTful uri GET請求中獲得多少結果。我不知道有什麼方法可以做到這一點。有沒有辦法做到這一點?由於REST只拋出屬性,我不知道它是否能夠計算其結果,但它可以跳過結果並獲取結果的子集。

有人有什麼建議嗎?

哦,我的設置是一個LINQ to SQL,它填充了一個可查詢的通用List。數據服務使該列表可用。我已經嘗試了對列表的計數,但我總是得到數據庫的最大行,這不是我正在尋找的。

一般承認的答案

其他人可能會反對這個概念,但這對我來說似乎是合理的:

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

然後:

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>

注意:此處使用HEAD請求來獲取計數,而無需提取完整數據集。 HEAD請求僅檢索HTTP標頭,而不是檢索響應的主體。

這將是我能想到的最RESTful方式,表明在通過網絡發送之前你會得到多少結果。主要技巧是為它提供最好的標題名稱。 X-Result-Count是不錯的,但是如果你能找到現有技術並重複使用它們的標題名稱選擇,那就更好了(只要它們沒有把它命名為真正愚蠢的東西)。也就是說,我不指望你會有太多運氣,所以你應該堅持使用X-Result-Count

另外,我認為你可能誤解了“REST”實際上需要什麼。沒有理由你不能通過範圍給出表示。例如:

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>

但是,要成為RESTful,您需要能夠告訴客戶關於/your/api?range=0-9/your/api?page=1&perpage=10標識的表示,而不使用帶外信息。例如,如果您的/your/api頁面返回太多結果,請臨時重定向到/your/api?page=1&perpage=10 ,並包含指向/your/api?page=2&perpage=10超鏈接。請注意,此上下文中的超鏈接可能是這樣的簡單:

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

現在,用於導航API調用結果的信息是帶內實際的RESTful。

從本質上講,REST是一種簡單的HTTP,其緩存是正確的,並且通常可以使用合理的URI進行測量。它也是“超文本作為應用程序狀態的引擎”(即資源應鏈接到其他資源)。它不是一種協議,它是一種建築風格。任何以不同方式告訴你的人都最好被命名為Roy Fielding。

附加物:

如果要指示總計數與頁數,可以像這樣定義標題:

X-Result-Count: 0-9/100000000

或根據需要進行調整。


熱門答案

為什麼不讓資源處理該類型元數據的查詢?假設

GET /items

返回您的項目列表,如下所示:

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

然後像:

GET /items?info

可以返回一個這樣的空列表:

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

或者可能是這樣的通用信息文檔:

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

您還可以實現這樣的“信息”資源:

GET /info?items&users

可能會返回:

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


許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因