Php 基于资源的API挑战
我在基于资源的RESTAPI中遇到了一些挑战。在这种情况下,API应该是一种资源,而不是一种操作。例如,为了获取类别列表,我们使用了Php 基于资源的API挑战,php,api,rest,Php,Api,Rest,我在基于资源的RESTAPI中遇到了一些挑战。在这种情况下,API应该是一种资源,而不是一种操作。例如,为了获取类别列表,我们使用了/categories(get)而不是/getAllCategories,为了创建一个新的类别列表,我们使用了/categories(POST)而不是/createCategories。但也存在一些挑战: 挑战1: 在创建产品时,我们有一个init请求来初始化表单的选择框(如类别列表和品牌列表)。通过旧方法,我们发送一个请求来获取产品创建页面的所有先决条件。但是在基
/categories(get)
而不是/getAllCategories
,为了创建一个新的类别列表,我们使用了/categories(POST)
而不是/createCategories
。但也存在一些挑战:
挑战1:
在创建产品时,我们有一个init
请求来初始化表单的选择框(如类别列表和品牌列表)。通过旧方法,我们发送一个请求来获取产品创建页面的所有先决条件。但是在基于资源的方法中,我们应该有/categories(GET)
和/brands(GET)
,这会导致有2个请求,而不是一个请求(这似乎是一种不好的做法,而且很耗时)
挑战2:假设我们有一个用于支付列表的资源。管理员可以查看所有付款列表(通过/payments(GET)
),但每个用户必须能够查看自己的付款。API结构应该如何?(如果你说users/payments/1
,那将是不正确的,因为通过将1更改为2,他可以访问其他用户的付款。此外,我在钩子中控制授权,因此在控制器中检查它不是一个好主意)
挑战3:
想象一下,在一个页面上,我通过/products/1(get)
得到一个产品(仅产品),在另一个页面上,我想得到产品1,包括所有细节,如(品牌、评论、评论、订单等)。这个API的结构应该如何
任何想法都将不胜感激
(如果你说用户/付款/1,那就不是真的,因为通过将1更改为2,他可以访问其他用户的付款)
不,他只能检索您允许的内容。通常的方法是安排/users/payments/1
和/users/payments/2
都有访问控制列表以确保数据安全。通常,尝试“匿名”访问受保护的资源将产生响应的某些变体,而在凭据不足的情况下授权的请求将收到响应(或在某些情况下)
想象一下,在一个页面上,我通过/products/1(get)得到一个产品(仅产品),在另一个页面上,我想得到产品1,包括所有细节,如(品牌、评论、评论、订单等)。这个API的结构应该如何
两个资源—一个提供产品摘要,另一个生成详细描述
标识符的拼写并不重要:
/products/1/verbose
/products/1?verbose
/verbose/products/1
/products/1?verbose=true
/products/1?verbose=INFO
/products/1?verbose=7
这些都很好
在创建产品时,我们有一个init请求来初始化表单的选择框(如类别列表和品牌列表)。按照旧方法,我们发送一个请求来获取产品创建页面的所有先决条件。但是在基于资源的方法中,我们应该有/categories(get)和/brands(get)这会导致有2个请求,而不是一个请求(这似乎是一种糟糕的做法,而且很耗时)
这里的“应该”似乎指向了错误的方向——没有什么特别的原因使您不能发送默认值来响应初始查询
这里的冲突可能是有人试图将您的资源模型与数据模型结合起来。回顾一下Mike Amundsen在这方面的工作可能会有所帮助
编辑
关于第三个,init是一个动词而不是一个资源,所以这不是一个好主意
GET /4d335e92-9ae9-4bd6-a08a-089f6459a710
虽然
4d335e92-9ae9-4bd6-a08a-089f6459a710
是一个动词,但工作正常。谢谢。关于第一个,我在钩子(预控制器钩子)中处理我的可访问性。所以我不想检查方法中的令牌).关于第二个,你说的verbos
是什么意思?请给我举个例子好吗?关于第三个,init
是动词而不是资源,所以这不是个好主意。