如何设计RESTful api来兑换优惠券?

问题描述 投票:0回答:2

我正在设计一个RESTful api来兑换优惠券。每张优惠券只能兑换一次,兑换后优惠券的有效期更长。

(POST) /coupons/{couponCode}/redeem

因为redeem是一个动词,所以似乎违反了RESTful指南。我可以把redeem改成redemption吗?或者我可以使用

(POST) /coupons/{couponCode}

顺便说一句我不太清楚为什么使用POST而不是PATCH,是因为PATCH是幂等的而POST不是?我的意思是,当优惠券第一次兑换时,它将在数据库中标记为redeemed,但一旦完成,相同的请求将不再更新此值。

rest api-design restful-url
2个回答
2
投票

似乎违反了RESTful指南,因为redeem是一个动词

REST不关心您用于资源标识符的拼写。

所以这些选择都很好

POST /coupons/{couponCode}/redeem
POST /coupons/{couponCode}
POST /{couponCode}/redeem
POST /i/am/a/banana
POST /4ccd2f6f-a81e-4b70-b45c-20ce9f8732b5

标识符拼写约定类似于变量命名约定;它们的存在只是为了减轻人们的负担,并受当地公约的约束。机器不在乎。

重要的是,用于更改的目标uri与缓存中要用于invalidate的资源的标识符相匹配。

我不太清楚为什么使用POST而不是PATCH,是因为PATCH是幂等的而POST不是?

不可以。不同之处在于,PATCH承诺有效载荷是一个补丁文档,也就是说对“the”资源表示的一组编辑的表示,而POST只是说“这是一个要由资源”。

(POST和PATCH都不是幂等的,因为它发生了。)

想象一下文档存储,文档大小约为1TB。您可能想要更改其中一个文档。自然的方法是GET当前的表示,进行更改,然后PUT您的文档版本。但是如果你的变化非常小,那么就会有很多浪费的工作带着文档的重复副本。

因此,我们使用PATCH,以便我们可以复制编辑的小表示,而不是完整的文档。

POST更为通用 - 这是一个带有正文的不安全消息,这几乎是它所承诺的全部内容。该主体可能是资源的新表示,或者应用于当前表示的补丁,或者完全不同的东西。

为什么使用redeem不违反REST?不应该只是动词的HTTP方法吗?

因为REST是一种建筑风格,它说资源标识符应该是URL(RFC 1738) - 尽管这些日子通常被理解为URI(RFC 3986) - 或URN(RFC 8141)。

如果你看一下RFC 3986,我想你会发现“动词”这个词并没有出现在文档的任何地方。您可以查看用于解释URI的ABNF规则,并且任何地方都没有关于动词的内容。

REST并不关心 - 在主要用例中,URI只是客户端使用的不透明字节序列。

例如,尝试在浏览器中单击此链接,它是否有效?

https://www.dictionary.com/browse/stop

“停止”恰好是英语动词的事实不会影响其功能。

我还看到一些RESTful设计指南建议不要使用动词

是的,网络上充满了不了解主题的人的建议,或者谁理解了主题并且没有清楚地表达出来,等等。

REST不提供强制任何特定的URI设计风格。

在REST中,标识符只是一个标识符,如UUID,散列签名或代理键。在HTTP消息的上下文中,它并不意味着什么,它只是一个缓存键。消息语义来自method,而不是请求目标。

GET /A/post HTTP/1.1

POST /B/get HTTP/1.1

DELETE /C/put HTTP/1.1

PUT /D/patch HTTP/1.1

这些请求行中没有歧义,第一个标记是定义语义的方法,第二个标记只是一个任意标识符。机器每次都能正确使用它们。

Recommended Viewing


0
投票

最好使用您公开兑换操作的网址路线。此路由应使用POST http请求,因为您将修改服务器上的资源,并将couponCode作为参数。

(POST) /coupons/redeem/{couponCode}

我认为赎回和赎回之间没有区别。我认为像赎回这样的动词更适合指定一个动作。

也可以使用http PATCH或PUT请求。作为惯例,我们使用PATCH或PUT在创建资源后更新资源以更改其中一个属性。如果您愿意使用PATCH请求更新,请说出您已创建的优惠券,那么您可以定义没有兑换操作的网址路由。请求正文将包含要为优惠券对象更新的字段(例如,状态从“待处理”到“已兑换”)

(PATCH / PUT) /coupons/{couponCode}

许多人使用以下约定:

GET /objects (return list of objects)
GET /objects/id (return object)
PUT /objects/id (update object)
POST /objects (add object)
DELETE /objects/id (remove object)
© www.soinside.com 2019 - 2024. All rights reserved.