【问题标题】:Passing array in GET for a REST call在 GET 中传递数组以进行 REST 调用
【发布时间】:2012-08-10 06:41:39
【问题描述】:

我有一个 url 可以为这样的用户获取约会:

/user/:userId/appointments

如果我想为多个用户获取约会,该 url 应该是什么样子?

应该是:

/appointments?users=1d1,1d2..

谢谢, 克里斯。

【问题讨论】:

    标签: rest restful-url restful-architecture


    【解决方案1】:

    集合是一种资源,因此 /appointments 可以作为资源。

    集合通常还通过查询字符串提供过滤器,这基本上就是 users=id1,id2... 的内容。

    所以,

    /appointments?users=id1,id2 
    

    作为过滤的 RESTful 资源很好。

    【讨论】:

    • 如果你有 30 个键值对要传递怎么办?
    【解决方案2】:

    我认为序列化 REST 调用参数是一种更好的做法,通常通过 JSON 编码它们:

    /appointments?users=[id1,id2]
    

    甚至:

    /appointments?params={users:[id1,id2]}
    

    然后您在服务器上对它们进行解编码。从长远来看,这将为您提供更大的灵活性。

    只需确保在发送参数之前也对参数进行 URLEncode!

    【讨论】:

    • ?{users:[id1,id2]} 不遵循 ?key1=val2&key2=val2 的查询字符串参数约定。
    • 另外,您是否有在查询字符串过滤器中提供序列化对象的主要服务示例?据我所见,大多数提供逗号分隔选项或查询格式(如 OData)的简单过滤器
    【解决方案3】:

    根据您选择的服务器架构/框架,另一种可行的方法是一遍又一遍地重复相同的论点。像这样的:

    /appointments?users=id1&users=id2
    

    在这种情况下,我建议使用单数形式的参数名称:

    /appointments?user=id1&user=id2
    

    Jersey(用于 Java)等框架本机支持这一点。更多详情请关注this question

    【讨论】:

    【解决方案4】:
    /appointments?users=1d1,1d2.. 
    

    没问题。这几乎是您唯一明智的选择,因为您无法使用 GET 传递正文。

    【讨论】:

      【解决方案5】:

      这对我有用。

      /users?ids[]=id1&ids[]=id2
      

      【讨论】:

        【解决方案6】:

        不要使用http GET,而是使用http POST。和 JSON。或 XML

        这就是您发送到服务器的请求流的样子。

        POST /appointments HTTP/1.0
        Content-Type: application/json
        Content-Length: (calculated by your utility)
        
        {users: [user:{id:id1}, user:{id:id2}]}
        

        或者在 XML 中,

        POST /appointments HTTP/1.0
        Content-Type: application/json
        Content-Length: (calculated by your utility)
        
        <users><user id='id1'/><user id='id2'/></users>
        

        您当然可以按照您的建议继续使用 GET,因为它肯定更简单。

        /appointments?users=1d1,1d2
        

        这意味着您必须保持数据结构非常简单。

        但是,如果/当您的数据结构变得更复杂、http GET 并且没有 JSON 时,您的编程和识别数据的能力将变得非常困难。

        因此,除非您可以保持数据结构简单,否则我强烈建议您采用数据传输框架。如果您的请求是基于浏览器的,那么行业通常的做法是 JSON。如果您的请求是服务器-服务器,那么 XML 是最方便的框架。

        JQuery

        如果您的客户端是浏览器并且您没有使用 GWT,您应该考虑使用 jquery REST。 Google 使用 jQuery 开发 RESTful 服务。

        【讨论】:

        • 我认为这不是正确的方法。您正在获取资源而不是发布新资源。
        • 我认为您不了解 http GET/POST 的用途。它们不符合这些词的英语词典含义。 POST 是在尝试 GET 但参数不是放在 url 中而是放在 io 流中时。
        • 有人对 POST 方法理解不足,但根据英文词典的含义,否决我,这非常令人困惑。你不能因为选择以这种方式定义它的人所做的句法决定而责备我。不要杀死信使。
        • 您可以使用这样的 POST,但它不是惯用的 - “根据设计,POST 请求方法请求 Web 服务器接受并存储包含在请求消息正文中的数据。” en.wikipedia.org/wiki/POST_(HTTP)
        • 由于历史上在 HTML 表单中的使用,而不是后来出现的 REST 的设计,POST 一直用于不暴露请求参数,并且今天仍然以这种方式使用。并且是推荐的做法。不管维基百科怎么说。
        猜你喜欢
        • 1970-01-01
        • 2017-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-19
        • 1970-01-01
        相关资源
        最近更新 更多