【问题标题】:REST URI Design : Optional and multivalue information passingREST URI 设计:可选和多值信息传递
【发布时间】:2011-08-20 17:34:36
【问题描述】:

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

这里是按邮政编码搜索经销商的 URI。

http://localhost:8080/dealer/zip/10080

如果用户选择复选框,那么 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){
    .. . ..
    }

这是传递可选值和多个值的正确方法吗?谁能帮我应用最佳实践?

【问题讨论】:

  • 这看起来不错。您的问题可能有点笼统。你有什么特别担心的吗?

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


【解决方案1】:

我不确定是否会将特定邮政编码中的经销商搜索映射到资源;感觉不太对劲。相反,我有一个列出所有经销商的资源,个别经销商是该资源的子资源。如果可以返回受属性限制的子资源列表的子集(例如,它们的邮政编码),那么这将是实现搜索的好方法,否则我将有一个单独的搜索处理程序来返回链接列表匹配经销商资源。

@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) { ... }
}

【讨论】:

    【解决方案2】:

    这没关系,除非你的 URL 变得太长(虽然 URL 长度不受任何规范的限制,但某些浏览器和中介会限制它,因此最好将其保持在 1K 以下)

    如果太长,可以使用 POST 代替 GET。

    附:您的代码中有错误,它应该是 @QueryParam("servicetype") List&lt;String&gt; servicetype) 以匹配示例 URI。

    【讨论】:

      【解决方案3】:

      如果您认真了解和应用 REST,我建议您阅读REST paper,如果您还没有这样做的话。

      根据该论文中提出的架构,每个 URL 都映射到一个资源。 资源可以是外在的和有形的东西,例如汽车经销商。或者它可能是“虚拟”的东西,例如“区域”,甚至是可能包含经销商的邮政编码。

      关于如何参数化查询,请考虑您希望使用什么资源来满足或公开查询。为什么将“zipcode”视为可变参数,与说您的“servicetype”有什么不同?他们不都是选择经销商子集的资格吗?想想你为什么要让它们与众不同——这可能是有充分理由的。

      例如,你可以这样做:

      考虑 URL 到资源的映射。可能是两个不同的 URL 映射到相同的“结果”。你需要决定这是否适合你。

      检索资源然后在客户端对其进行查询也非常好。并非所有工作都需要由服务器完成。您可以在客户端搜索http://server/dealer/zip/10070 获得的结果,以找到提供所需服务的结果。这可能会或可能不会提高性能,具体取决于传输的数据大小以及查询的频率和种类。

      假设一个总体结果集为 10 个(例如,一个邮政编码中有 10 个经销商),搜索提供服务 X 的经销商的 Javascript foreach 循环将比要求服务器执行该查询的附加 AJAX 调用更快代表客户。

      【讨论】:

      • 您似乎在暗示路径参数会比查询字符串参数更好地识别资源。从 REST 的角度来看,情况并非如此。 REST 不在乎您使用哪个。似乎服务类型属性本质上不是分层的,因此将它们填充在路径中就像将方形钉子放在圆孔中一样。重要的是要意识到http://localhost:8080/dealer/zip/10080?servicetype=type1&amp;servicetype=type2&amp;servicetype=type3http://localhost:8080/dealer/zip/10080 是不同的资源。
      • @Darrel Miller,我完全清楚不同的 URL 引用不同的资源。主要是要考虑为什么 zip 应该与 servicetype 区别对待作为经销商的鉴别器,并考虑服务器端鉴别是否比邮政编码更重要或合适。
      • 重新阅读你的答案我明白你的意思。不幸的是,您只选择了路径参数作为鉴别器。如果是http://server/dealer?service=transmission&amp;service=lighttrucks,我认为您的最后一个示例对于服务器来说会更容易处理
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-05
      • 2012-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-27
      相关资源
      最近更新 更多