在 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,它会生成所有上层,你不需要手动编写。
我正在寻找一种最佳方法来实现 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,它会生成所有上层,你不需要手动编写。