Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 基于资源的API挑战_Php_Api_Rest - Fatal编程技术网

Php 基于资源的API挑战

Php 基于资源的API挑战,php,api,rest,Php,Api,Rest,我在基于资源的RESTAPI中遇到了一些挑战。在这种情况下,API应该是一种资源,而不是一种操作。例如,为了获取类别列表,我们使用了/categories(get)而不是/getAllCategories,为了创建一个新的类别列表,我们使用了/categories(POST)而不是/createCategories。但也存在一些挑战: 挑战1: 在创建产品时,我们有一个init请求来初始化表单的选择框(如类别列表和品牌列表)。通过旧方法,我们发送一个请求来获取产品创建页面的所有先决条件。但是在基

我在基于资源的RESTAPI中遇到了一些挑战。在这种情况下,API应该是一种资源,而不是一种操作。例如,为了获取类别列表,我们使用了
/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是一个动词而不是一个资源,所以这不是一个好主意

请注意,尽管“initialize”是一个动词,但上述标识符的工作原理与您预期的完全相同。另请参见:

URI是标识符;本质上与变量名非常相似。机器不关心您使用的拼写,因为标识符没有语义意义

GET /4d335e92-9ae9-4bd6-a08a-089f6459a710

虽然
4d335e92-9ae9-4bd6-a08a-089f6459a710
是一个动词,但工作正常。

谢谢。关于第一个,我在钩子(预控制器钩子)中处理我的可访问性。所以我不想检查方法中的令牌).关于第二个,你说的
verbos
是什么意思?请给我举个例子好吗?关于第三个,
init
是动词而不是资源,所以这不是个好主意。