[英]RESTful services - how to design a URL with many parameters
我已經開發了REST服務,但是現在我意識到自己在做錯事。
例如,我有一個檢索有關特定設備信息的服務。 每個設備都有一個地址: ector.room.group.id 。 我為此GET方法執行的URI是: (...)/services_devices/{sector}/{room}/{group}/{id}
但現在我意識到我不應該使用'/'
來分隔設備地址,對不對? 我應該如何將地址傳遞給此方法? 使用';'
?
我的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? 我在許多方法中都有這個“錯誤”。
如果您的資源中存在層次結構,則路徑變量是適當的。
在您的情況下,設備和地址之間似乎存在層次結構,但是首先出現在地址之后,在deviceName之后。 可以將“ deviceName”視為另一個層次結構步驟。
反映上述關系的最佳方法是以下網址:
(...)/扇區/房間/組/ ID /設備名稱
然后,您可以像下面這樣映射設備的另一個屬性:
(...)/部門/房間/組/ ID /設備所有者
JAX-RS映射將是:
@GET
@Path("{sector}/{room}/{group}/{id}/deviceName")
@Produces("application/json")
public String getDeviceName(@PathParam ...) {
//impl.
}
是的,如果deviceName是資源的唯一相關屬性,則可以省略“ deviceName”,並且原始映射正確。
如果/sector/room/group/id
具有許多屬性,則應考慮返回路徑的組合對象:
@GET
@Path("{sector}/{room}/{group}/{id}")
@Produces("application/json")
public Device getDeviceName(@PathParam...) {
}
REST體系結構風格引入了HATEOAS,這意味着客戶端和服務器之間是松散耦合的。 只是客戶不知道URL的樣子,並無法從先前的響應中獲取它們。 (類似於通過HTML頁面瀏覽)。 當然,將至少有一個客戶端知道的URL,即入口點。 從這個角度來看,您是否需要正確的URI是無關緊要的。 什么是正確的URI? URI與RFC對齊時正確。
您可能正在引入不是RESTful的URL模式,因為它暗示了客戶端和服務器之間的緊密耦合(客戶端必須了解URL模式並具有從中構造URL的能力;根據您的情況填充扇區/房間/等)。 )
另請參閱此帖子:
http://roy.gbiv.com/untangled/2008/rest-apis-must-be-超文本驅動
我的建議是; 不要浪費時間在URL模式上,要使URL盡可能簡單,平面層次結構也有很多好處,並遵循HATEOAS原則。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.