簡體   English   中英

RESTful服務-如何設計具有許多參數的URL

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM