在 REST 中使用 'createModel' 是一种好习惯吗?

Is it a good practice to use 'createModel' in REST?

我正在寻找一种最佳方法来实现 REST-full 应用程序的端点,该应用程序将负责创建新的图书馆订单。假设我有以下资源。

如果我想获取特定作者的所有书籍,我可以使用下一个端点:

HTTP GET
api/books/author/123

如果我想获取特定书籍的所有订单,我可以使用下面提供的端点:

HTTP GET
api/books/456/orders

我的问题是什么是最合适的 URL 以及用于创建订单的端点的请求模型? 在我看来可以

HTTP POST
api/books/456/orders

还有一个问题。在 REST 中使用像 CreateOrder 这样的请求模型是一种好的做法吗?如果我想创建一个 REST-full 网络应用程序,我可以使用以下请求模型:

class CreateOrder 
{
   AuthorId: number;
   BookId: number;
   ClientId: number;
} 

有时这让我很困惑。请求模型是否应该看起来像我们的资源?

您的终点不需要总是以 /books 开头。您可以引入另一个端点 /orders 来创建或获取订单。因此,要创建订单,您可以:

HTTP POST
api/orders 

你说的'request model'是HTTP请求体结构吗?如果是,则不需要与您的后端 persisted/domain 模型 100% 匹配。只需包含服务器创建订单所需的足够参数即可。 (例如包括 bookId 而不是整本书对象等)

顺便说一句,要获取特定作者的所有书籍,更常见的是使用查询参数,例如:

HTTP GET
api/books?authorId=123

Let's assume that I have the following resources.

你的 "resources" 看起来很像 "tables"。资源更接近于有关信息的(逻辑)文档。

what will be the most suitable URL and a request model for an endpoint that will create orders

在大多数情况下,您使用什么 URL 创建订单并不重要。在超媒体应用程序中(想想 HTML),我将提交一个 "form",与该表单关联的元数据将为客户端描述如何从表单数据组成请求.

所以操作表单的人或代码不需要知道任何关于 URL 的信息(你最后一次查看 Google 的位置是什么时候实际发送您的搜索?)

就通用 Web 组件而言,URL/URI 只是一个不透明的标识符 - 他们不关心拼写 的意思

他们关心的一件事是拼写是否他们缓存的内容相同。 POST /x 消息成功的后果之一是 /x 的缓存表示无效。

所以如果你愿意,你可以考虑在创建订单时应该刷新哪个缓存文档,然后将请求发送到该文档的标识符。

Should request models look like our resources or not?

没必要。再一次,想想网络——如果您发布表单数据,创建订单的表示会是什么样子?

clientId=1&bookId=2

或者也许

bookId=2&copies=3

如果 "who is creating an order" 使用权限 headers 回答。

在我们的 HTTP 请求和响应中,我们从根本上发送消息表示 - 符合某种模式的字节序列。这些字节序列必须或不能与我们在实现中的其他地方使用的相同,没有特别的原因。

您正在做的不是 REST,而是基于 HTTP 的 CRUD。 REST 不关心您的 URI 结构,资源与数据库表相去甚远。如果CRUD是你所需要的,那么下载一个CRUD生成器库https://github.com/search?q=crud+generator&type=Repositories,它会生成所有上层,你不需要手动编写。