war*_*iuc 2 rest ember.js json-api
我在Django中有两个模型:
class Thread(models.Model):
entity = models.ForeignKey(Entity, null=True, blank=True)
...
class ThreadMessage(models.Model):
thread = models.ForeignKey(Thread, related_name='messages')
author = models.ForeignKey(User)
...
Run Code Online (Sandbox Code Playgroud)
现在,客户端想要创建一个包含第一条消息的新线程.它首先做一个POST /threads
创建一个新线程并找出它id
然后POST /messages
在thread
字段中传递找到的id .
我想如果在Ember的一个请求中完成所有这些是合理的和可能的,例如:
POST /messages
{"message": {"text": "text", ...},
"thread": {"entity": 1}}
Run Code Online (Sandbox Code Playgroud)
响应将是:
{"message": {"text": "text", "id": 5678, "thread": 1234, ...},
"thread": {"entitity": 1, "id": 1234, ...}}
Run Code Online (Sandbox Code Playgroud)
是的,这是完全合理的.
人们似乎以一种非常奇怪且非常无知的方式解释REST.粗略阅读用于POST和PUT 的HTTP RFC 7231将确认您是在坚实的基础上.
资源表示可以表示ANYTHING.关键是要保留REST操作的语义.所以PUT可以用于CREATE和REPLACE之类的操作(我倾向于认为PUT是REPLACE而不是UPDATE,因为REPLACE更接近幂等语义而不是UPDATE)
对受支持的端点的PUT应接受GET返回的任何表示.POST可以做任何你想要的东西,因为它不需要支持幂等语义.
HTTP和REST旨在支持可能与其他资源重叠的资源表示,RFC明确说明了这一点.在集合端点上执行GET时,您始终执行此操作.
您不是通过在单个请求中包含一个包含子消息的线程来破坏REST,而IMO是一个非常有效的用例,用于服务器上的合理参照完整性.每当需要事务语义时,POST或PUT完全有效,可以在单个请求中创建服务器上的对象图.这很简单,如果你可以在一个请求中获取它,你应该能够在一个请求中将它PUT,所以要仔细考虑你的URL和参数.
例如,你可能有一个返回所有的消息和端点可支持的参数,只是返回的信息,一些子线程终点/api/threads?include=hasRead
返回刚刚id
和hasRead
在线程每封邮件,或者只是某些范围内的"页".然后,您可以使用相同的端点和参数进行PUT,然后只hasRead
批量更新属性.
任何挂在这上面的人都可能从未考虑过访问控制.访问控制需要基于允许访问的内容从一个用户到另一个用户的不同资源视图.资源的这种不同视图在HTTP认证头和/或请求URL中传达; 再次,REST不会被子设置或重叠资源打破.
因此,继续创建所需对象的最小图形,并将它们PUT或POST.我使用V4 UUID,因此客户端可以自己分配ID(以及资源端点),这允许我使用PUT进行创建和替换操作,并在没有客户端< - >服务器ID映射问题的情况下连接复杂的对象图.
归档时间: |
|
查看次数: |
438 次 |
最近记录: |