RESTful 设计问题
发布于 7 年前 作者 leavesdrift 5839 次浏览 来自 问答

假设一个场景是产品页,我们设计为:

GET /api/products

查看某个具体某个产品:

GET /api/products/:productid

现在需要一个新增产品页,以输入产品信息发布,那么不就变成了:

GET /api/products/create

但是这个时候就会跟 productid 冲突?

24 回复

不是这么设计,应该用POST /api/products表示创建一个新的产品,因为这时候产品没有生成,所以没有productId

来自酷炫的 CNodeMD

没,就是获取产品创建页

@leavesdrift 页面url不带/api 接口带api

来自酷炫的 CNodeMD

@leavesdrift 那就是GET /api/products

来自酷炫的 CNodeMD

@unliar 老哥 你是说用URL永远都是一样的,用API_name 吗

@q86002618 产品创建页,不是产品页

@unliar 我这个问题就是后端管理的一个问题,用

if (req.params.productid === 'create'){
   //  
}

判断是可以的,但是怎么看怎么怪,所以想知道怎么处理这种情况

一个所有产品显示页,还需要一个产品创建页,自然都是 get 方法,但是会跟查看具体某个产品信息有点冲突

读取页面用 /api 开头有点奇怪

@leavesdrift

path: ‘/hkstocks’, 列表页 path: ‘/hkstocks/post/:id?’, 列表元素修改[有id]以及发布页[无id]

目前我是这样写的 。我有种其实你的问题和reatful没关系的感觉,浏览器输入框上的地址一直是get。 个人愚见

来自酷炫的 CNodeMD

@unliar 我就是想知道这种情况怎么做,还是不清楚,郁闷啊,get也不能忽视呀,其他反而简单

ERSTful 我的理解是,你想要告诉服务器你想要什么, 查资源用get 添加新资源 用post 修改已存在的资源 put 删除一个资源delete

然后你想对那个资源进行操作,需要用url来描述!

整体思路就是,用url明确描述你要对服务器的资源,进行哪种行为操作!

来自酷炫的 CNodeMD

@maosiyu 我觉得可能是这样,我并没有分开,实际上 api 不应该提供 GET /api/products/create 这部分应该是页面去做,页面填写好带着数据请求 POST /api/products,谢谢你的回答!

我是这样做的 页面 /products/create api api/products/create

@leavesdrift 从百科上复制了 原则条件 Web 应用程序最重要的 REST 原则是,客户端和服务器之间的交互在请求之间是无状态的。 从客户端到服务器的每个请求都必须包含理解请求所必需的信息。 如果服务器在请求之间的任何时间点重启,客户端不会得到通知。 此外,无状态请求可以由任何可用服务器回答,这十分适合云计算之类的环境。 客户端可以缓存数据以改进性能。

因此,区分开是有必要的。

来自酷炫的 CNodeMD

假设一个场景是产品页,我们设计为:

如果用的是express路由控制 更换下陆游位置应该就可以了

GET /api/products/create

GET /api/products/:productid

如果是 RESTful,那么 URL 中就不应该出现 create,包括 deleteupdate 之类的「动词」都不应该出现。 所以,楼主提到的三个 API,大体可以这样:

//获取所有产品
GET /api/products
//获取某个产品
GET /api/product/:productid
//新增一个产品
POST /api/product

标准restful api

/**
 * Auto generate RESTful url routes.
 *
 * URL routes:
 *
 *  GET    /api/coursess[/]        => course.list()
 *  GET    /api/coursess/new       => course.new()
 *  GET    /api/coursess/:id       => course.show()
 *  GET    /api/coursess/:id/edit  => course.edit()
 *  POST   /api/coursess[/]        => course.create()
 *  PATCH  /api/coursess/:id       => course.update()
 *  DELETE /api/coursess/:id       => course.destroy()
 *
 */

@i5ting 谢狼叔总结

回到顶部