[英]REST URI Design : Optional and multivalue information passing
我有一個搜索小部件,人們可以通過郵政編碼搜索汽車經銷商。 還有一些可選的復選框可以優化該小部件中的搜索。
這是用於按郵政編碼搜索經銷商的URI。
http://localhost:8080/dealer/zip/10080
如果用戶選擇復選框,則URI為
http://localhost:8080/dealer/zip/10080servicetype=type1&servicetype=type2&servicetype=type3
我正在使用球衣 。 這是Java代碼。
@Path("/dealer")
@Produces(MediaType.APPLICATION_JSON)
public class DealerLocatorRS {
private DealerService dealerService=new DealerService();
@GET
@Path("/zip/{zip}")
public List<Dealer> getByZip(@PathParam("zip") String zip,
@QueryParam("servicetype") List<String> servicetype){
.. . ..
}
這是傳遞可選和多個值的正確方法嗎? 有人可以幫助我運用最佳做法嗎?
我不確定是否將搜索到的特定郵政編碼的經銷商映射到資源。 感覺不太正確。 取而代之的是,我有一個列出所有經銷商的資源,而每個經銷商都是該經銷商的子資源。 如果可以返回受屬性(例如其郵政編碼)限制的子資源列表的子集,那么這將是實現搜索的好方法,否則我將有一個單獨的搜索處理程序來返回鏈接列表匹配經銷商資源。
@Path("/dealer")
public class Dealers {
@GET
public List<Dealer> getAll() { ... }
@GET
@Path("search/byZip")
public List<URI> getByZip(@QueryParam("zip") String zip, ...) { ... }
@Path("{dealerId:[^/]+}")
public Dealer getDealer(@PathParam("dealerId") String id) { ... }
}
如果您認真了解和應用REST,建議您閱讀REST文章 ,如果您尚未這樣做的話。
根據該論文提出的架構,每個URL都映射到一個資源 。 資源可能是外在的和有形的,例如汽車經銷店。 也可能是“虛擬”之類的東西,例如“區域”,甚至可能是包含經銷商的郵政編碼。
關於如何參數化查詢,請考慮要使用哪些資源來滿足或公開查詢。 為什么將“郵政編碼”作為變量參數,而不是說“服務類型”呢? 他們不是兩個都可以選擇經銷商的資格嗎? 考慮一下為什么要使它們與眾不同-可能有充分的理由。
例如,您可以這樣做:
HTTP://服務器/經銷商/ ZIP / 10070
列出所有經銷商在10070
HTTP://服務器/經銷商/服務/傳輸
列出所有從事變速箱工作的經銷商
HTTP://服務器/經銷商/服務/傳輸/ ZIP / 10070
列出所有從事郵政編碼10070傳輸工作的經銷商
HTTP://服務器/經銷商/ ZIP / 10070 /服務/傳輸
列出郵政編碼10070中進行傳輸工作的所有經銷商
HTTP://服務器/經銷商/服務/傳輸/服務/ lighttrucks
列出所有從事變速箱和輕型卡車服務的經銷商
考慮一下URL到資源的映射。 可能是兩個不同的URL映射到相同的“結果”。 您需要確定是否適合您。
檢索資源然后在客戶端對它進行查詢也很好。 並非服務器需要完成所有工作。 您可以搜索客戶端http:// server / dealer / zip / 10070所獲得的結果,以找到提供所需服務的結果。 這取決於性能,取決於傳輸的數據大小以及查詢的頻率和種類。
假設總結果集為10(例如,一個郵政編碼中有10個經銷商),則Java foreach循環搜索提供服務X的經銷商將比另一個AJAX調用(要求服務器代表A做該查詢)的速度更快。客戶。
可以,除非您的URL太長(盡管URL長度不受任何規范限制,但某些瀏覽器和中介機構對此進行了限制,因此,最佳做法是將其保持在1K以內)
如果太長,可以使用POST而不是GET。
PS您的代碼中有錯誤,應該為@QueryParam("servicetype") List<String> servicetype)
以匹配示例URI。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.