Json 我应该如何以RESTful方式唯一地标识请求后资源?

Json 我应该如何以RESTful方式唯一地标识请求后资源?,json,web-services,rest,api-design,Json,Web Services,Rest,Api Design,在我的应用程序中,我有一个顺序的概念,它是一个资源,是其他资源(绘图)的集合。(背景:) 当用户在API中创建订单时,它将提交一个JSON,如下所示: { "order": { "draws": [ { "background_color" : "rgb(0,0,0)", "font_size" : 14 }, { "background_color" : "rgb(255,0,0

在我的应用程序中,我有一个顺序的概念,它是一个资源,是其他资源(绘图)的集合。(背景:)

当用户在API中创建订单时,它将提交一个JSON,如下所示:

{
    "order": {
      "draws": [
        {
            "background_color" : "rgb(0,0,0)", "font_size" : 14
        }, 
        {
           "background_color" : "rgb(255,0,0)", "font_size" : 16
        },
        ...
       ]
    }
}
      "draws": [
        {
            "background_color" : "rgb(0,0,0)", "font_size" : 14, "url" : "generated_url"
        }, 
        {
           "background_color" : "rgb(255,0,0)", "font_size" : 16, "url" : "generated_url2"
        },
        ...
       ]
然后,我的应用程序将向用户返回一个跟踪号,这样他就可以看到该订单的当前状态,并将该JSON推送到一个队列中,以便可以在后台对其进行处理

但是,我有一个问题:

一旦订单完成,用户获取订单,我将返回一个绘图列表。大概是这样的:

{
    "order": {
      "draws": [
        {
            "background_color" : "rgb(0,0,0)", "font_size" : 14
        }, 
        {
           "background_color" : "rgb(255,0,0)", "font_size" : 16
        },
        ...
       ]
    }
}
      "draws": [
        {
            "background_color" : "rgb(0,0,0)", "font_size" : 14, "url" : "generated_url"
        }, 
        {
           "background_color" : "rgb(255,0,0)", "font_size" : 16, "url" : "generated_url2"
        },
        ...
       ]
我的问题是:

用户如何知道从结果中得出的结论是他提交的结论?以下是我想到的两个解决方案:

1-当用户提交订单时,对于每个绘图,他都会提交一个唯一的id,因此稍后创建这些绘图时,他将能够映射它们

2-当用户提交订单时,我的应用程序为每个绘图创建一个唯一的id。后来在DB中实际创建绘图时,我将该唯一id放入DB中

考虑到一个订单最多可以有100.000次提款,什么更合理呢?

选项2类似于Oreilly Books的RESTful Web Services Cookbook第47页上的解决方案

收到POST请求后,创建一个新资源,并返回状态代码202(已接受)具有新资源的表示形式。此资源的目的是让客户端跟踪异步任务的状态。设计此资源时,使其表示形式包括请求的当前状态和相关信息,如时间估计

当客户端向任务资源提交GET请求时,根据请求的当前状态执行以下操作之一:

仍在处理 返回响应代码200(OK)和当前状态的任务资源表示

成功完成后 返回响应代码303(请参阅其他)和包含显示任务结果的资源URI的位置标头

论任务失败 返回响应代码200(确定),任务资源表示通知资源创建失败。客户端需要读取表示的正文以查找失败的原因。”


摘录自:Subbu Allamaraju。“RESTful Web Services Cookbook-Subbu Allamaraju.epub。”

请注意,您的客户机已经为每个请求的绘图分配了一个唯一的ID:这由它们在
绘图
数组中的位置暗示。因此,将图纸编号为“1”、“2”等是多余的

只要您的客户机和服务器都能够在不重新排序的情况下处理此数组,请求和响应中的绘制之间就有一个自然的映射,我相信您已经有了一个RESTful解决方案。那是假设

  • 当客户端提交订单时,服务器返回的是一个URI(不仅仅是跟踪号),它指向相应的新
    订单
    资源的位置

  • 当客户端获得此订单表示时,响应包括订单的处理状态及其关联的
    draw
    资源列表,服务器已为每个资源分配了一个指向其表示的唯一URI(如上面的示例响应所示)

    此时,每个绘图的URI成为其唯一标识符,通过数组之间的简单映射,客户机可以轻松地使用此信息更新其自己的顺序表示


为了提高效率(和最大的RESTfull),当客户端发布新订单时,您可能会让服务器立即以(或者可能)状态响应,并在响应正文中包含新订单的表示,包括新的绘图URI。这样,您的客户既可以提交订单,也可以在一次交互中使用响应更新自身。

这里唯一的问题是,当客户提交订单时,由于创建订单需要一段时间,我无法使用新创建的资源的ID进行响应,基本上是因为它尚未创建。这就是为什么我想用一个跟踪号码来回复。你是说创建订单需要一段时间,还是说完成订单需要一段时间?我知道绘制需要一些时间才能完成,但我希望创建一个订单所涉及的仅仅是在数据库中添加几行。更重要的是,在您的域模型中,当客户端提交订单时,订单就存在了,而不是当其组件绘制完成时(如果有的话)。Simon South,创建订单需要在DB(关联的绘制)中创建10.000多行。然后我会说RESTful方法将返回202 Accepted on order submission以及客户机可以轮询的“作业”资源的URI,以监控订单创建的进度(最终将返回订单本身的URI)。但这并不能回答你关于映射的问题。这就是我正在做的:)。谢谢西蒙