我有一个搜索小部件,人们通过邮政编码搜索汽车经销商。还有一些可选的复选框可以优化该窗口小部件中的搜索。
以下是按邮政编码搜索经销商的URI。
http://localhost:8080/dealer/zip/10080
如果用户选择了checbox,则URI将为
http://localhost:8080/dealer/zip/10080servicetype=type1&servicetype=type2&servicetype=type3
我正在使用jersey。这是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){
.. . ..
}
这是传递可选和多个值的正确方法吗?任何人都可以帮助我应用最佳实践吗?
答案 0 :(得分:3)
我不确定我是否会将特定邮政编码中的经销商搜索到资源;它感觉不太对劲。相反,我有一个列出所有经销商的资源,个别经销商是其中的子资源。如果可以返回受属性限制的子资源列表的子集(例如,他们的邮政编码)那么这将是实现搜索的好方法,否则我将有一个单独的搜索处理程序返回链接列表匹配经销商资源。
@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) { ... }
}
答案 1 :(得分:3)
如果您认真理解并应用REST,我建议您阅读REST paper,如果您还没有这样做的话。
根据该论文中提出的架构,每个URL映射到资源。 资源可能是外在的和有形的东西,如汽车经销商。或者它可能是“虚拟”的东西,如“区域”,甚至可能包含经销商的邮政编码。
关于如何参数化查询,请考虑要用于满足或公开查询的资源。为什么你会将“zipcode”视为一个可变参数,与你的“servicetype”有什么不同?他们不是两个选择经销商子集的资格者吗?想想你为什么要让它们与众不同 - 可能有充分的理由。
例如,你可以这样做:
http://server/dealer/zip/10070
列出所有经销商在10070
http://server/dealer/service/transmissions
列出所有做传输工作的经销商
http://server/dealer/service/transmissions/zip/10070
列出所有在zip 10070进行传输工作的经销商
http://server/dealer/zip/10070/service/transmissions
列出zip 10070中进行传输工作的所有经销商
http://server/dealer/service/transmissions/service/lighttrucks
列出所有做传输工作并做轻型卡车服务的经销商
考虑将URL映射到资源。可能是两个不同的URL映射到相同的“结果”。你需要决定这是否适合你。
检索资源然后在客户端对它进行查询也很完美。并非所有工作都需要由服务器完成。您可以在客户端搜索http://server/dealer/zip/10070获得的结果,以查找提供所需服务的结果。这取决于传输的数据的大小以及查询的频率和种类,这可能是也可能不是性能获胜。
假设整体结果集为10(例如,邮政编码中的十个经销商),搜索提供服务X的经销商的Javascript foreach循环将比要求服务器执行该查询的额外AJAX调用更快代表客户。
答案 2 :(得分:1)
这没关系,除非您的网址太长(虽然网址长度不受任何规范的限制,但某些浏览器和中介会限制它,因此最佳做法是将其保持在1K以下)
如果它变得太长,您可以使用POST而不是GET。
P.S。您的代码中存在错误,应该@QueryParam("servicetype") List<String> servicetype)
以匹配示例URI。