UUID作为主键-RESTAPI指南

UUID作为主键-RESTAPI指南,rest,api,uuid,endpoint,Rest,Api,Uuid,Endpoint,在postgres中,我创建了一个表: create table examples(id uuid PRIMARY KEY DEFAULT uuid_generate_v4(), name VARCHAR); 为了从表示例中获取所有值,我在框架处理程序中创建了一个端点: GET "/examples[/]?" 如果使用SERIAL或INT type作为主键,则单个示例值的端点将如下所示: GET "/examples/([0-9]+)*" 但是我使

在postgres中,我创建了一个表:

create table examples(id uuid PRIMARY KEY DEFAULT uuid_generate_v4(),
                     name VARCHAR);
为了从表示例中获取所有值,我在框架处理程序中创建了一个端点:

GET "/examples[/]?"
如果使用SERIAL或INT type作为主键,则单个示例值的端点将如下所示:

GET "/examples/([0-9]+)*"
但是我使用UUID作为主键,我创建了这个怪物:p

GET "/examples/([0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[0-9a-f][0-9a-f]{3}-[0-9a-f]{12})"
使用示例:

examples/ef935fbc-8c43-4b22-b160-14124a29312e
examples/{uuid}
这在我的情况下是有效的,但是有没有更好的方法呢? 有什么好的指导方针可以告诉我们如何处理这样的问题吗?

就目前而言,使用UUID的字符串表示作为路径段的一部分是可以的。只是文字。由于REST客户机只是遵循服务器提供给他们的链接,所以使用什么拼写并不重要

对于路由框架来说,有些选择会更容易管理,但是路由的选择只是一个实现细节,对于API的使用者来说并不重要

使用框架进行粗粒度路由,然后自己实现细粒度控制,这并没有什么错

GET /examples/{data}

if (isUUID(data)):
    // cast the data to an id yourself, then do the right thing
if "the-other-thing" == data:
    // do the other thing

我们是在谈论核查吗?如果不是,就告诉你的用户它是一个字符串?我不知道问题出在哪里。是的,我应该在方法中输入的uuid到达数据库之前检查它,还是我创建的正则表达式足够?