Api HTTP:在目标标头不是URI的情况下使用COPY方法是否可以接受? 背景

Api HTTP:在目标标头不是URI的情况下使用COPY方法是否可以接受? 背景,api,http,copy,rfc,Api,Http,Copy,Rfc,我正在构建一个API,允许客户端操作地理空间对象。这些对象包含世界上的位置(纬度/经度)和大量元数据。实际的API相当大,因此我在这里提供了一个简化版本 当前API 考虑一个包含两个对象、特性和属性的API 功能端点为/api/feature,如下所示: { id: 5, name: "My super cool feature", geometry: { type: "Point", coordinates: [

我正在构建一个API,允许客户端操作地理空间对象。这些对象包含世界上的位置(纬度/经度)和大量元数据。实际的API相当大,因此我在这里提供了一个简化版本

当前API 考虑一个包含两个对象、特性和属性的API

功能端点为
/api/feature
,如下所示:

{
    id: 5,
    name: "My super cool feature",
    geometry: {
        type: "Point",
        coordinates: [
            -88.043355345726,
            43.293055846667315
        ]
    }
}
{
    id: 3,
    feature_id: 5,
    name: "attr-name",
    value: "value"
}
属性端点是
/api/attribute
。属性如下所示:

{
    id: 5,
    name: "My super cool feature",
    geometry: {
        type: "Point",
        coordinates: [
            -88.043355345726,
            43.293055846667315
        ]
    }
}
{
    id: 3,
    feature_id: 5,
    name: "attr-name",
    value: "value"
}
您可以通过使用不同的HTTP方法向这些对象的端点发出HTTP请求来与这些对象进行交互,就像您可能期望的那样:

  • GET/api/feature/5
    读取id为5的功能
  • PUT/api/feature/5
    更新id为5的功能
  • POST/api/feature
    创建新功能
  • DELETE/api/feature/5
    删除id为5的功能
属性也是如此

属性通过外键与特征相关(通常表示为“特征具有多个属性”)

问题 能够制作一个功能及其所有元数据(属于它的所有属性)的副本将非常有用。用例或多或少是这样的,“我只是做了这个特性,给了它一堆属性,现在我想要的是相同的东西……但是在那里。”所以这两个特性之间的唯一区别就是它们的几何结构

解决方案1:让客户去做。 我的第一个想法是让客户来做。在新位置创建同名的新功能,然后迭代源功能上的所有属性,发出
POST
请求在新功能上复制这些属性。然而,这存在一些问题。首先,它不是原子的。如果客户端的Internet连接在此过程中断开,您将留下一份不完整的副本,这是不完整的。其次,它可能会很慢,特别是对于具有许多属性的特性。无论如何,这是个坏主意

解决方案2:向API添加复制功能。 在单个API调用中执行复制服务器端是更好的方法。这就引出了
COPY
方法。能够在单个
copy/api/feature/5
请求中对功能进行深度复制似乎是理想的

问题 这里,我的问题是
COPY
的语义不太适合我对它的预期用途。对资源发出
COPY
请求会将该资源的副本执行到
destination
头中指定的目标。根据RFC,
Destination
必须存在,并且它必须是一个URI,指定复制的资源将在哪里结束。在我的例子中,复制特征的目标是一个几何体,它显然不是URI


因此,我的问题是:在
复制
请求的
目的地
头中填充几何体的json是否违反了规范?在这里,
COPY
是正确的使用方法吗?如果没有,还有什么替代方案?我只是想确定我是以最符合HTTP规范的方式实现的。

那么,您需要一种方法将目标设置为URI(为什么这是一个问题)。如果您将Destination header字段用于其他内容,那么您就没有使用COPY per spec(顺便说一句,当前的规范是RFC 4918)

问题在于无法使Destination成为有意义的URI。功能的URI是
/api/feature/{id}
,在创建功能之前,id是未知的。因此,
Destination:/api/feature
是客户端所能做的最好的功能,并且仍然需要一个位置来指定新功能的几何体(在主体中?作为参数?)。@jpk您是如何解决这个问题的?“我正在看一个类似的问题。”“克里斯蒂亚科涅斯库,很抱歉让你久等了。那是很久以前的事了,但我相信我最终只是把geojson塞进了目标标头中。最后,我更关心的是构建逻辑上一致的API,而不是冒犯规范编写者的敏感度。在该API的上下文中,即使它不完全符合规范,它也是有意义的。我希望有一种规范认可的方法来实现它,但我没有找到一种。lol+1用于HTTP犹太规范