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