【问题标题】:Organising resource (URI) in REST API在 REST API 中组织资源 (URI)
【发布时间】:2011-06-01 11:44:34
【问题描述】:

场景 1
在我的 Web 应用程序中,说有一个用于将员工添加到系统的屏幕。一旦用户输入员工姓名后,它会根据一些逻辑自动生成员工代码(即下一个字段),并且已经存在数据库中的记录。

现在我想公开这个应用程序的 REST API,以便第三方开发人员可以在它之上构建。因此,我将有一个名为 /Employee 的资源,它将响应 GET、PUT 和 DELETE 动词。但是当客户端需要自动填充代码时,这是一个 GET 操作,它将在什么资源上?我应该创建一个新资源/EmployeeCodeFor/{Name} 还是应该在/Employee/{Name}/GenerateCode 上获得它?如果我使用/Employee/{Name}/GenerateCode,那么我的资源如何获取、放置和删除Employee,即实际上是/Employee/{Id}

场景 2
在这里,让我们以 stackoverflow 帖子为例。所以可以说资源是/Post/{Id}。与前面的示例一样,只要我跳出Title 字段,它就会列出可能的重复问题。

我应该再次在哪个 URL 上获得那些可能的重复项?

我现在想不出更多的场景。但是在现实生活中的应用程序开发中可能会出现很多这样的场景。如何以 RESTful 方式实现它们?

方案 1 的更新
Code 和 Id 是两个不同的字段。 id是主键,代码可以跨部门重复,只是为了说明。同样要生成代码,应首先提供名称。因此,如果用户键入名称“FirstName LastName”,则服务器可能会生成 FL003 作为代码,假设在所述部门中已经有两个员工的名字从 F 开始,姓从 L 开始。可以根据登录用户识别部门。

【问题讨论】:

    标签: api rest resources


    【解决方案1】:

    让服务器有机会在新资源中预填充一堆元素的一种方法是这样做

    POST /Employees
    {with empty body}
    =>
    201 Created
    Location: http://example.org/employee/3443
    
    <Employee Id="3443">
       <Code>E1001</Code>
       <FirstName></FirstName>
       <LastName></LastName>
    </Employee>
    

    这使服务器有机会提供默认值。如果您正在寻找一种更具交互性的方式让服务器在输入期间提供反馈,我有另一种方法,但需要更多解释。

    【讨论】:

    • 我想知道您的另一种方法,因为我不想在用户点击提交之前创建员工记录。事实上,在填写名称后,用户还可能会导航到其他页面。
    【解决方案2】:

    场景 1

    假设您的员工代码是唯一标识符。在这种情况下,要获得它,您将允许用户填写新员工的任何字段,然后进行 POST。服务器将生成代码并使用指向 /Employee/{generated_code} 的链接响应 POST,这是您新创建的员工的记录。

    /Employee 上的 GET 将返回所有员工的列表。 /Employee/{a_code} 上的 GET 将为您提供员工详细信息。

    场景 2

    您可以对/Post 集合进行某种查询,例如/Post?title_like={question_title}GET /Post?title_like=REST How to 会返回一个包含“REST How to”的所有问题的列表。

    【讨论】:

    • 非常感谢您的回答。基本上,我将在/Employee/{Id} 上获取、放置和删除员工。所以Id 是Employee 实体的主键,而不是genereated_code。其次,/Employee 不会返回所有员工的列表,但/Employees(注意尾随的s)资源会。还可以在/Employees 资源上搜索和过滤员工。因此,对于搜索和分页列表,我有 /Employees 资源,我认为这是最适合此目的的资源。
    • 另外,客户端无法发送 {generated_code} 因为代码实际上是在服务器上生成的,正如我已经提到的it generates the employee code automatically (which is the next field) based on some logic and already present records in the database
    • 关于您与第二种情况相关的答案,/Post/{Id} 上的 GET 请求不会期望带有它的 ID 吗?
    • 好的,如果你有/Employees 资源,那么你就不需要/Employee。您应该将/Employees/{id} 作为代表一名员工的资源。正如你所说,服务器生成ID,所以我的答案仍然是一样的。您必须在员工集合上使用 POST 来添加新员工并获取他的 ID。
    • 对于第二种情况,ID 是 in URL。 ID 允许识别服务器将返回的资源。
    猜你喜欢
    • 2020-10-19
    • 2012-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多