【问题标题】:Mix of query and form params in REST service?REST 服务中查询和表单参数的混合?
【发布时间】:2013-08-20 04:40:41
【问题描述】:

我们有一个 REST API,对于某些操作,我们提供异步请求选项。对于异步请求,服务将立即返回一个可用于查询是否完成的令牌,而对于同步请求,直到操作完成后才会返回响应。

目前的设计如下所示:

网址:PUT /api/orders/1234?async=true

请求正文:customerName=My Company&city=Dallas

直观地说,像这样混合查询和表单参数似乎是错误的,但是查询参数(异步)为服务调用提供选项,而不是资源的属性。这是我们没有将其包含在请求正文中的主要原因。

这种方法看起来是一个好的设计,还是有更好的更“REST-y”的方法来完成同样的事情?

【问题讨论】:

    标签: rest


    【解决方案1】:

    Prefer 标头旨在完全按照您要执行的操作。请参阅spec

    【讨论】:

    • 来自草稿:“过期:2013 年 7 月 11 日”。所以这个标头不是 HTTP 的一部分。
    • @Tichodroma 该规范已获得批准,正在通过 IETF 正当程序。 datatracker.ietf.org/doc/draft-snell-http-prefer/history 由于有广泛的互操作规范,网络可以正常工作。媒体类型不是“HTTP 的一部分”。许多 HTTP 方法不是由 HTTP 规范定义的(例如 PATCH)。响应代码也是如此。这就是它应该如何工作的方式。
    【解决方案2】:

    这样的网址

    POST /api/orders/1234?async=true
    

    不是 RESTful。为什么POST?这看起来像 RPC over HTTP。

    你的资源是什么?如果涉及一些计算,则将计算建模为资源。 POST 到计算集合以创建一个新的。接收计算结果的Location 标头。

    POST /api/orders
    
    custoerName=My Company
    city=Dallas
    

    这可能会返回如下响应:

    201 Created
    Location: /api/orders/1234
    

    那么客户端可以GET结果:

    GET /api/orders/1234
    

    服务器会响应:

    200 OK
    
    Some result body.
    

    如何使这个异步?

    你写:

    但是查询参数(异步)为服务调用提供选项,而不是资源的属性

    这是完全错误的。 URI 中的所有内容 都用于标识 资源。 REST 不是用参数调用方法。

    我建议始终在将计算/交易/购物车建模为资源时使用上述两步法。创建它,检索它。

    【讨论】:

    • 你是对的,这应该是我试图描述的场景中的“PUT”(更新)。我将编辑原始问题以澄清。但是,问题的要点是如何让客户端指定是否要等待操作完成。
    • 客户端等待或不等待。这完全取决于他。在这两种情况下,服务器都应始终使用描述资源当前服务器状态的响应来响应 GET 请求。
    猜你喜欢
    • 1970-01-01
    • 2010-10-26
    • 2013-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    • 1970-01-01
    • 2015-08-14
    相关资源
    最近更新 更多