REST URI设计:可选和多值信息传递

时间:2011-05-07 12:28:33

标签: java web-services rest architecture jax-rs

我有一个搜索小部件,人们通过邮政编码搜索汽车经销商。还有一些可选的复选框可以优化该窗口小部件中的搜索。

以下是按邮政编码搜索经销商的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){
    .. . ..
    }

这是传递可选和多个值的正确方法吗?任何人都可以帮助我应用最佳实践吗?

3 个答案:

答案 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”有什么不同?他们不是两个选择经销商子集的资格者吗?想想你为什么要让它们与众不同 - 可能有充分的理由。

例如,你可以这样做:

考虑将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。