Json RESTURL:整数vs字符串和PUT的行为
这是一个多部分的问题:Json RESTURL:整数vs字符串和PUT的行为,json,api,rest,Json,Api,Rest,这是一个多部分的问题: 给定一个RESTAPI,其URL包含自然数作为路径段,通常预期的行为是将该数解释为索引还是键 对深度资源路径执行PUT时,通常预期的行为是将路径解释为状态声明吗?这意味着将创建路径上所有不存在的资源。或者,如果路径上不存在任何资源,是否应返回错误 展开问题2,如果路径确实存在,并且路径定义的资源结构不同于现有的资源结构,那么是否应该覆盖先前存在的资源(再次作为状态声明),或者是否应该返回一个指示类型不匹配的错误 例如,考虑端点: domain.tld/datasource
例如,考虑端点:
domain.tld/datasource/foo/2/bar/1/baz
是一个字符串,用于标识顶级资源foo
可以解释为索引或键2
是一个字符串,被解释为键bar
可以解释为索引或键1
是一个字符串,解释为键,指向叶节点baz
foo
下的domain.tld/datasource
中的数据可以是以下任意一种:
基于索引的:
[
null,
null,
{
'bar': [
null,
{'baz': null}
]
}
]
基于密钥的:
{
'2': {
'bar': {
'1': {
{'baz': null}
}
}
}
}
{
'2': {
'bar': [
null,
{'baz': null}
]
}
}
基于索引和键的:
{
'2': {
'bar': {
'1': {
{'baz': null}
}
}
}
}
{
'2': {
'bar': [
null,
{'baz': null}
]
}
}
问题1
2
和1
应该被视为整数还是字符串?由于这可能是不可能知道的,REST URL中是否有用于解决这种情况的类型注释标准?到目前为止,白板上的一些解决方案如下所示,2
是一个键,1
是一个索引:
domain.tld/datasource/foo/2:str/bar/1:int/baz
- 其中
表示前面的值是一个键:str
- 和
表示前面的值是索引:int
- 其中
domain.tld/datasource/foo/2/bar/1/baz?types=ki
- 其中,
,作为k
类型的成员0,映射到第一个类似int的段,并指示该值是一个键
- 和
,作为i
类型的成员1,映射到第二个类似int的段,并指示该值是索引
- 其中,
我可能把问题复杂化了,或者遗漏了一些基本的东西,但我没有找到多少明确的指导。我完全可以控制系统,可以执行我认为合适的任何规则。然而,我对这种体验很感兴趣,这意味着交互应该很容易推理,逻辑性、预期性、确定性等等。从我的角度来看,在尝试“restful”或“resty”时,你永远不应该做“深层资源”之类的事情——我真的看不到好处。这只会使系统更难理解、使用和开发(例如:查看您的问题:) 为什么不保持简单,为单个资源提供“单一”URL?这样,客户就可以清楚地知道PUT将做什么,DELETE将做什么 因此,作为一个示例,您可以使用列表资源端点domain.com/datasource,它将返回所有已注册的foo的列表。它将返回一个HREF列表…如domain.com/foo/1。。。在一些元数据下面,foo/1还可以包含一个条形图列表……但是,它们并没有嵌套在“foo URI”中,它们是简单的顶级资源,例如“domain.com/bar/1” 这样,客户机就可以轻松地删除、更新和创建项目。您可以通过在实体中设置正确的链接来链接它们
关于你的问题2和3:我认为这完全取决于你的系统。如果您将domain.com/datasource/foo/1/bar/2/baz链接视为一个大资源,这意味着响应将不仅包括关于baz的信息,还包括关于bar、foo和datasource的信息,是的,put将“重新创建”(完全更新)资源。如果该链接“only”返回有关baz的信息,那么put只能完全更新此资源。关于最后两个问题,我认为这取决于RESTful API的级别。例如,查看,在对资源执行PUT之前,您必须实际导航到该资源,因此您可以假设该路径是有效的。同时,硬编码URL而不是导航并不是使用此类API的正确方式。