2013-04-08 45 views
0

我開發了REST服務,但現在我意識到我在做錯事。RESTful服務 - 如何設計具有多個參數的URL

例如,我有一項服務可以檢索有關特定設備的信息。每個設備都有一個地址:sector.room.group.id。 我爲這個GET方法所做的URI是:(...)/services_devices/{sector}/{room}/{group}/{id}但是現在我意識到我不應該使用'/'來分隔設備地址,對吧? 我應該如何將地址傳遞給此方法?使用​​3210?

我GET方法是:

@GET 
@Path("{sector}/{room}/{group}/{id}") 
@Produces("application/json") 
public String getDeviceName(@PathParam("sector") int sector, @PathParam("room") int room, @PathParam("group") int group, @PathParam("id") int id) throws Exception 
{ 
    String name = null; 

    try { 
      name = new DevicesManager().getDeviceName(sector, room, group, id); 
    } catch (Exception e) { 
      e.printStackTrace(); 
    } 
    return name; 
} 

有這種變化的一個簡單的方法,有一個正確的URI?我在許多方法中都有這個「錯誤」。

+0

如果您只是將您的URI更改爲/ services_devices/{address}並開始以您指定的格式(即/services_devices/sector.room.group.id)接受地址,該怎麼辦? – JSS 2013-04-08 17:24:59

+0

嗯,你是對的!我將需要解析這些字段,但我認爲沒有問題。 – user2144555 2013-04-08 17:31:10

+0

id在您的應用程序中是唯一的,還是隻在指定的組中唯一?換句話說,如果你只提供/ services_devices/id,你可以查找扇區,房間和組? – phatfingers 2013-04-08 18:08:30

回答

0

如果您的資源路徑中存在層次結構,則適當的變量。

在你的情況下,似乎在設備和地址之間有一個層次結構,但首先是地址和deviceName之後。 「deviceName」可以被認爲是更多的層次結構步驟。

以反映上述關係將以下網址的最佳方式:

(...)/部門/間/組/ ID/DEVICENAME

然後,您可以有另這樣映射的設備的屬性:

(...)/扇區/間/組/ ID/deviceOwner

的JAX-RS映射將是:

@GET 
@Path("{sector}/{room}/{group}/{id}/deviceName") 
@Produces("application/json") 
public String getDeviceName(@PathParam ...) { 
//impl. 
} 

是的,如果該設備名稱是資源的唯一相關的屬性,那麼你就可以離開了「設備名稱」,您的一部開拓創新的映射是正確的。

如果/sector/room/group/id資源有許多屬性,你應該考慮返回由對象的路徑:

@GET 
@Path("{sector}/{room}/{group}/{id}") 
@Produces("application/json") 
public Device getDeviceName(@PathParam...) { 
} 
+0

那麼,現在我的第一種方法是有道理的,因爲'id'代表一個屬於'group'的設備,而這個組屬於''room',屬於'sector'。所以它是元素(參數)的層次結構,所以它們可以用'/'分隔。我對嗎? – user2144555 2013-04-08 18:23:56

+0

是的。想想如果你有更多的設備屬性,不只是「deviceName」,也許你有deviceNumber,owner等等。如果是這種情況,創建並從GET方法返回一個'Device'對象 – dcernahoschi 2013-04-08 18:26:56

0

REST架構風格介紹HATEOAS,這意味着客戶端和服務器的鬆耦合。簡單地說,客戶端並不知道URL的外觀如何,並從之前的響應中獲取它們。 (它類似於瀏覽HTML頁面)。當然,至少會有一個URL,這是客戶已知的入口點。從這個角度來看,您需要擁有正確的URI是無關緊要的。什麼是正確的URI?當它的形式與RFC一致時,URI是正確的。

您可能正在引入不是RESTful的URL模式,因爲它暗示了客戶端和服務器之間的緊密耦合(客戶端必須知道URL模式並且能夠從中構建URL;填充扇區/房間等) 。你的情況)

也看到這個職位:

http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven

我的建議是,不要浪費時間在URL模式上,儘可能簡化URL,扁平層次也有很多好處,並遵循HATEOAS原則。