对于一个作为资源的内部标识符(如person_id
)的系统,是否可以在不同的唯一值上调用直接API访问权限(如licensee_id
)?如何定义(RESTful)API的ID?
那么这样的API设计是否合理?
GET /people/{:licensee_id}
和:
PUT /people/{:licensee_id}
{
"name": "John"
}
对于一个作为资源的内部标识符(如person_id
)的系统,是否可以在不同的唯一值上调用直接API访问权限(如licensee_id
)?如何定义(RESTful)API的ID?
那么这样的API设计是否合理?
GET /people/{:licensee_id}
和:
PUT /people/{:licensee_id}
{
"name": "John"
}
这意味着,你在谈论的资源没有一个唯一的标识符,但 有两个。
如果我做,我会从两个不同的URL暴露在相同的资源,像这样:
/licensee/:licensee_id
/people/:person_id
因此,如果您的API中的代码的一部分用户打交道的人(即可轻松访问person_id
而无需其他呼叫)呼叫第二个,否则他可以呼叫第一个。
其中一个原因,除了它对您的API的消费者更容易的事实之外,是您实施起来更容易,您不必了解传递给您的是licensee_id
或a person_id
这样做是有道理的。你并没有真正放弃任何重要的信息,这会让别人很难做出SQL注入攻击(因为引用id的其他表中的所有外键都会有不同的名字)。
如果不是直接访问id字段,那么需要一个不同的列,这个列的索引类似于从独特的用户字段创建的uuid或md5。我认为这样做的唯一好处是有人不能使用API来“漫游”用户或其他对象。
我现在走的是'/ people?licensee_id = {:licensee_id}'。我想我最终可能会得到'/ by-by-license','/ people-by-blah',因为我的上下文中的一些独特属性只是属性,而没有定义其他类型的人员。最后,我确实喜欢你的建议的清晰度。 – eoinoc 2013-05-16 09:33:34
很高兴帮助^^ – 2013-05-16 09:36:12