CNode

RESTful接口定义 对于相同实体的查询接口 后台管理员和用户的接口分别如何定义?

问答
Gguo-q发布于9 年前最后回复9 年前15 回复6633 浏览0 收藏

举例: 前提:系统有三方 1. 运营方、2. 店铺(B端用户)3. 用户(C端用户) 用户进行下单操作 接口定义: 查询订单详情接口: To B: /sellers/:sellerId/orders/:orderId To C: /buyers/:buyerId/orders/:orderId 问题: 对于订单的这样的实体好解释,订单可以是用户的也可以是属于店铺的。如果只有运营平台和买方,运营平台查询一个商品信息可以是/items/:itemId,用户查看也是/items/:itemId。查询出来的信息,应该是运营平台要多一些,类似商品的销售提成这样的信息。如何定义RESTful路由?

查看回复

回复 (15)

A
Aoqin#1·9 年前

根据权限返回?

来自酷炫的 CNodeMD

S
stonephp#2·9 年前

如果返回的描述不一样,那就定义成不一样的uri。分别去处理。

Y
yszou#3·9 年前

对外肯定是 2 个不相干的资源。 至于代码层面是否要重用,如何重用是另一个问题了。

G
guo-q#4·9 年前
引用 stonephp如果返回的描述不一样,那就定义成不一样的uri。分别去处理。

@stonephp 对,对外肯定是两个接口,类似资源定位的方式去体现,但是不知道具体该如何定位。因为类似商品资源不属于用户,如何去定义这部分资源,直接 /items/:itemId 就这样取获取信息。那如果管理员获取商品信息,也是/items/:itemId,这样就没办法在路由上进行区分了。

G
guo-q#5·9 年前
引用 yszou对外肯定是 2 个不相干的资源。 至于代码层面是否要重用,如何重用是另一个问题了。

@yszou 代码层面 经过路由层之后 应该是拦截器,在拦截器中解析用户信息,根据不同的权限设定返回值范围。拦截器过后可以进入controller,从这一步开始 就应该可以逻辑重用了,如果有特殊的地方,可以进行权限判断。但是不知道我举的例子该如何去定义路由。。

G
guo-q#7·9 年前
引用 yszou@guo q ,这个不用太纠结吧。 `/api/v1/items/:id /api/admin/v1/items/:id`

@yszou 这样符合RESTful 基于资源定位这样的说法吗

L
liuqipeng417#8·9 年前

可以是同一个 url,根据权限返回不同数据 也可以在 url 上区分权限 也可以把权限参数放在 query 里

restful 对于权限的规范没有太多条条框框

G
guo-q#9·9 年前
引用 liuqipeng417可以是同一个 url,根据权限返回不同数据 也可以在 url 上区分权限 也可以把权限参数放在 query 里 restful 对于权限的规范没有太多条条框框

@liuqipeng417 我倒是有另一些观点,权限应该是根据token自解析之后,根据解析获取的权限信息判断比较好吧。

L
liuqipeng417#10·9 年前
引用 guo-q@liuqipeng417 我倒是有另一些观点,权限应该是根据token自解析之后,根据解析获取的权限信息判断比较好吧。

@guo-q 是的

我的意思是指权限在规范里没有太多约束,主要还是对资源实体的抽象合理就可以了

A
anziguoer#11·9 年前
  1. 可以根据用户的权限(或者用户的角色)来返回数据. RESTful 也有用户认证的标准, token. token 代表了一个实体的权限(角色). 判断 token 是哪一类的用户, 则返回对应的数据即可. 这样的话你上面定义的 url 是没有问题的.
  2. 可以定义不一样的 url 来区分不同的数据. 及1. 运营方可以是一个 url. 2. 店铺可以是一个 url.
X
xiaomi915#12·9 年前

dasdasd

G
guo-q#13·9 年前
引用 anziguoer1. 可以根据用户的权限(或者用户的角色)来返回数据. RESTful 也有用户认证的标准, token. token 代表了一个实体的权限(角色). 判断 token 是哪一类的用户, 则返...

@anziguoer 是的如果把你的两个观点捏合在一起我觉得是完美的,如果只是根据用户角色来返回数据会存在这样的一个问题,就是B端用户在C端登录并请求数据时返回的数据依然是B端能看到的所有数据,这显然并不是我期望的。

F
fancylife#14·9 年前

基本通过不同url或者同一url不同权限来区分,看你们团队的整体设计规范,避免A开发人员和B开发人员多个思路实现

M
mosaic101#15·9 年前

针对不同的系统 (Client),资源抽象 (Model) 也应该不同。 例如用户与运营平台对商品关注点是不一样的, 所以抽象 Model 的时候需要针对 Client 抽象出符合各自需要的 Model, 既然 Model 不同了,那就没必要共用同一个 url 了; 在 restful api 设计上可以在 baseurl 加入二级路由区分 client, 例如: http://xxxx.com /a + /items/:itemId , http://xxxx.com /c + /items/:itemId, 如果 api 有 version controller,也可以加在baseurl 区分, 例如: http://xxxx.com/a/v1 + /items/:itemId

参与回复
登录后即可参与回复。登录