Laravel 在RESTful API中创建依赖资源

Laravel 在RESTful API中创建依赖资源,laravel,api,rest,Laravel,Api,Rest,我对RESTful最佳实践的实现有点困惑 我有客户资源和许可证资源。创建许可证时需要客户。我的疑问是,我能否在许可证创建请求中合并客户对象,以便服务部门检查是否存在并有条件地创建客户,然后为客户创建许可证 场景1-创建客户,然后使用客户标识符分别创建许可证 POST/customers { 'email': 'user-1@example.com', 'mobile': '9876543210' } POST/licenses { 'customer': {

我对RESTful最佳实践的实现有点困惑

我有
客户
资源和
许可证
资源。创建许可证时需要客户。我的疑问是,我能否在
许可证
创建请求中合并客户对象,以便服务部门检查是否存在并有条件地创建客户,然后为客户创建许可证

场景1-创建客户,然后使用客户标识符分别创建许可证

POST/customers

{
   'email': 'user-1@example.com',
   'mobile': '9876543210'
}
POST/licenses

{
   'customer': {
        'email': 'user-1@example.com',
    },
    'expire_at': '2021-12-31'
}
{
   'customer': {
        'email': 'user-2@example.com',
        'mobile': '9876543210'
    },
    'expire_at': '2021-12-31'
}
场景2-使用客户详细信息创建许可证。(如果不存在,将自动创建客户)

POST/licenses

{
   'customer': {
        'email': 'user-1@example.com',
    },
    'expire_at': '2021-12-31'
}
{
   'customer': {
        'email': 'user-2@example.com',
        'mobile': '9876543210'
    },
    'expire_at': '2021-12-31'
}
场景2是否违反了RESTful概念

谢谢

我对RESTful最佳实践的实现有点困惑

不是你的错;互联网上有很多关于REST的令人困惑的信息

场景2是否违反了RESTful概念

启发式:你会如何在网站上做到这一点

这就是说,一个网页有一个表单,其中包含客户电子邮件、客户手机和过期信息的输入控制,在提交时将数据复制到发送到服务器的单个HTTP请求中,这是否明智

POST /licenses HTTP/x.y
Content-Type: application/x-www-form-urlencoded

email=user-2@example.com&phone=9876543210&expire_at=2021-12-31
网站总是这样做;很好。因此,让您的API做类似的事情也很好



/licenses
可能是也可能不是最佳目标uri。这很好,但也有一些暗示意味着使用不同的资源会更好(取决于URI设计的细节,以及您希望客户端立即刷新哪些文档)。

您可以执行其中任何一项操作,没有REST约束禁止使用单个HTTP请求创建多个资源。最好在API描述中记录这一点

另一方面,我宁愿将您的
createLicense或LicenseandCustomer->POST/licenses
操作拆分为
createLicenseAndCustomer->POST/licenses/和/customers
createLicense->POST/licenses
createCustomer->POST/customers
。至少因为吻的原则,这样感觉更好。但这实际上取决于API设计师的品味。从错误处理的角度来看,这也很有趣,因为您可以在创建许可证时出错,但在创建客户时会成功。如果您使用数据库传输和回滚,那么这部分成功/失败不会发生