【发布时间】:2016-11-29 08:53:13
【问题描述】:
如何设计如下操作:
- 计算
- 转换
- 翻译
例如:从“EUR”转换为“CNY”金额“100”。
这是/convert?from=EUR&to=CNY&amount=100 RESTful 吗?
【问题讨论】:
标签: rest restful-architecture restful-url
如何设计如下操作:
例如:从“EUR”转换为“CNY”金额“100”。
这是/convert?from=EUR&to=CNY&amount=100 RESTful 吗?
【问题讨论】:
标签: rest restful-architecture restful-url
什么都没有
/convert?from=EUR&to=CNY&amount=100
这不是 RESTful。您可以说这标识了一个 REST 资源。
但它看起来类似于 HTTP 上的 RPC(远程过程调用),在不像货币转换那么简单的情况下,会导致系统不是 RESTful。
总是问自己:我的资源是什么?
一个答案可能是:资源是转换结果,由两种货币和金额标识。那么如果你使用它会看起来更 RESTful
/conversion?from=EUR&to=CNY&amount=100
请注意,路径是名词 (conversion),而不是动词 (convert)。一般来说,如果你可以用名词命名一个 REST 资源,那么你就走在了正确的轨道上。
如果您将识别位放入查询参数 (?from=EUR&to=CNY&amount=100) 或路径中,这是一个个人喜好问题。你可以使用
/conversion/EUR/100/CNY
使用三个路径参数:
/conversion/{FROM}/{AMOUNT}/{TO}
【讨论】:
您的 API 在我看来不错:
/convert?from=EUR&to=CNY&amount=100
Lutz Horn 的answer 也提供了一个不错的选择。
如果您的 API 必须处理复杂或冗长的操作,使用 POST 可能是个好主意:
/calculate
您可以在请求中包含计算。这样可以避免在 URL 中包含冗长的计算。
如果您的 API 必须处理简单的操作,那么您可以使用这种设计:
/calculate/add/?param1=value1¶m2=value2
同样适用于subtract、multiply、divide 等。
/calculate/subtract
/calculate/multiply
/calculate/divide
对于翻译,我喜欢谷歌翻译的 API 设计:
/translate/{source}/{target}/value
这里,source 是您的源语言(例如 EN),target 是您的目标语言(例如 HI)。
最终,您的 API 设计取决于您的选择。
【讨论】: