Api HTTP:在目标标头不是URI的情况下使用COPY方法是否可以接受? 背景
我正在构建一个API,允许客户端操作地理空间对象。这些对象包含世界上的位置(纬度/经度)和大量元数据。实际的API相当大,因此我在这里提供了一个简化版本 当前API 考虑一个包含两个对象、特性和属性的API 功能端点为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/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请求来与这些对象进行交互,就像您可能期望的那样:
读取id为5的功能GET/api/feature/5
更新id为5的功能PUT/api/feature/5
创建新功能POST/api/feature
删除id为5的功能DELETE/api/feature/5
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犹太规范