2010-10-01 67 views
6

我們正在設計一個iPhone應用程序,該應用程序將回調到Tomcat中運行的RESTful服務。我們需要發送很多查詢參數,並超過了手機允許的最大值。使用* many *參數調用RESTful服務

即使在不修改服務器的意圖,是否使用與正文中的參數PUT調用RESTful? POST似乎不正確,因爲它不是冪等的,而PUT是(因此更類似於GET的行爲)。

謝謝。

+0

它是JSON還是XML? – Aliostad 2010-10-01 17:47:08

+4

REST的原則和精神比你的產品更重要。因此,您的產品不應該存在。 Mark 2010-10-01 17:47:59

+3

@Mark:非常好。如果你不能遵循法律的精神,就停止發展!爲什麼我沒有想到這個?我現在正在給我的老闆打電話,告訴他這個瘋狂的數據模型不適合Chen所說的原始關係模型,我們應該停止工作。優秀! – 2010-10-01 17:52:22

回答

4

如果你想要它RESTful,你可以這樣做:將參數傳遞給服務器(在你選擇的位置),或者你可以發佈它們並讓服務器爲你放置它們。無論哪種方式,您已經創建了一個可以保存所需參數的資源。然後你發送一個指向那個特定資源的GET。因此,在回答您的GET時,服務器知道從哪裏獲得大量參數。這將是RESTful。

也就是說,發送兩個請求不是很有效率,如果你可以用一個請求做同樣的事情。我只是想盡量務實。

考慮一下:PUT告訴代理他們不應該緩存響應,但是重試(通過線上的任何基礎設施元素)肯定是可能的,因爲它是冪等的(就像GET一樣)。 GET通過PUT提供了什麼?響應可以被緩存。但是有了這麼多的參數,我認爲無論如何大多數請求都是唯一的,對吧?因此,緩存不會經常帶來很多報酬。因此,使用PUT似乎是務實的,因此是正確的選擇。

+0

正如我在之前的評論中所說的,我們有很多參數的原因是每個參數都是iPhone上已有記錄的ID。我們正試圖阻止重新刷新這些記錄。您關於不緩存和唯一性的評論是apropos。 – Ralph 2010-10-04 11:45:32

1

它違反了REST的精神,但如果它有效,就要務實。

+0

有沒有RESTful的方法來做到這一點?我不是法律信函(或本案中的規範)的堅守者,但是如果有任何方法,我想遵循標準。 – Ralph 2010-10-01 17:55:23

6

您必須最大程度地符合性與HTTP三種選擇:

首先,你必須發送您的PARAMS以某種方式壓縮,形成一個較短的URL的選項。

二,也沒什麼可說GET,說你不能在請求發送消息體,在任何Content-Type-Length您選擇。並非所有的服務器都支持這一點,但HTTP協議本身就是如此。

第三,你可以發佈參數到/queries/資源,並與201 Created作出迴應,並在Location響應頭一個新的URL(如/queries/78a65g82),其中客戶端然後(反覆,甚至Ranges調用GET ,如果這是一個好處)來檢索結果。

+4

我想你可能會發現一些代理不會轉發GET請求的主體。 – 2010-10-01 19:33:45

+0

像Darrel一樣,你不應該傳遞GET消息 - 有效載荷,它可以在你的dev-setup中工作,但可以在你的prod-setup中崩潰。這太不可靠了,路由(以及涉及的代理)通常不在您的控制之下。 – 2010-10-02 15:34:47

+0

對於/ queries/78a65g82建議+1,這是我們使用的。 – balupton 2010-10-03 12:27:13