在构造API URL的不同方法之间,子域与子目录和版本控制之间有什么权衡?

在构造API URL的不同方法之间,子域与子目录和版本控制之间有什么权衡?,api,rest,dns,webserver,maintainability,Api,Rest,Dns,Webserver,Maintainability,我们有一个域名为example.com的web应用程序。现在我们想将此应用程序的一部分扩展为RESTAPI,我们正在讨论最佳URL模式 我们可以使用URL模式api.example.com或example.com/api。如果有的话,还有什么可权衡的呢? 此外,关于API版本控制的方法有哪些权衡?可以通过URL(v1.api.example.com,example.com/api/v1,或者一些奇怪的组合v1.example.com/api或api.example.com/v1)来完成。或者,也

我们有一个域名为
example.com
的web应用程序。现在我们想将此应用程序的一部分扩展为RESTAPI,我们正在讨论最佳URL模式

我们可以使用URL模式
api.example.com
example.com/api
。如果有的话,还有什么可权衡的呢?


此外,关于API版本控制的方法有哪些权衡?可以通过URL(
v1.api.example.com
example.com/api/v1
,或者一些奇怪的组合
v1.example.com/api
api.example.com/v1
)来完成。或者,也可以通过使用HTTP请求头(或其他方式)来完成此操作。

这取决于您的需要

如果您使用它,则会使API成为子域。基本上,如果您的REST服务将由多个客户端使用,那么这个URL模式是好的,但是如果只有一个客户端连接到您的API,那么这个模式是好的。然而,如果您想添加更多的API,并且有更多的客户端连接到它,那么最好使用它。例如,考虑以下内容:

http://example.com/reportapi/apioperation?parameters

http://example.com/paymentapi/apioperation?parameters

http://example.com/searchapi/apioperation?parameters

最后但并非最不重要的一点是,PayPal使用这种模式。

这是一种权衡的情况,没有单一的最佳解决方案

例如,如果您通过标准的web界面以及API提供内容,那么您需要类似
http://api.example.com/api//
只是将基于浏览器的应用程序访问与API交互分离。这有意义吗

示例:api.rottentomatos.com


然而,即使您的域专用于API调用,使用上述模式还是有意义的,并保留与应用程序交互的其他方式。例如,您可能想要,等等。

< P>我认为您应该考虑使用既不<代码>。http://api.example.comnor
http://example.com/api/v1

相反,我建议使用
http://example.com/api
和版本控制的内容协商

以下是我的想法,为什么:

使用子域:

根据,您在URI的授权部分定义API,用于定义主机,而不是在主机上定义应用程序或API。实际上,您正在为API创建一个不同的地址,这意味着API.example.com的身份验证可能不像example.com那样有效

这样做的一个有效原因可能是在为移动设备设计一个新实例时,例如Mobile,ExpLo.com,但我认为这更多的是一个基础结构的决策而不是一个功能性的。 在主域上使用未版本化路径:

这里有两位信息:一位表示存在API资源,另一位表示存在该API资源的版本号(v1)

使用
/api/
来区分api和(例如)可能在
/web/
下运行的web视图并没有什么坏处。这可以被视为常见的最佳做法


我不确定您是否有意这样做,但您的问题包括如何解决API版本控制的问题。就我个人而言,我认为API版本控制不应该使用URL来完成,因为它们旨在尽可能长时间保持稳定。相反,考虑使用HTTP内容类型信息来对API进行版本化。事实上,我发现这个方法用在。此外,这里还有一篇关于内容类型版本控制的非常古老但仍然有用的帖子。

以前在任何其他公司资产或开发团队的任何其他地方有过经验吗?两种选择都很好,在我们的一个项目中,我们选择了
api.XXXXX.com
format甚至,我们在工作中也进行了同样的讨论,我们选择了api.xxxx.com。这种做法似乎更为整洁。我们现在对API集群有不同的设置。有一个主要的区别-API.example.com会添加CORS请求,而example.com/API不会。Paypal API有点旧。Stripe正在使用api.Stripe.com。尽管如此,Paypal还是使用api.stackoverflow.com。Paypal不使用这种模式。贝宝使用
https://api.[sandbox].paypal.com/v1/
patternGitHub:https://api.github.com我觉得url中的版本遵循“酷URI不改变”的方式,比在版本中使用内容类型更好。为什么?假设您在将来的版本中将用户模型的名称更改为person,那么您只需将用户重定向到person。然后,在稍后,您决定添加一个名为users的新模型。现在,您必须更改url。相反,您可以从一开始就在url中使用版本控制。100个版本之后,如果您保持v1api工作,那么所有v1链接都将完全相同。简单。(加上URL比标题更容易更改)我绝对不同意这个答案。本的评论有点言过其实,但不是很清楚。重要的一点是,当有人将应用程序的功能建立在您的API上时,他们需要某种保证,即您的API始终会接受他们提供的内容,并从中返回他们期望的内容。如果您没有对URL进行版本设置,那么随着内部实现的成熟和变化,给定的URL将不可避免地开始漂移。100%不同意。如果需要,身份验证可以在所有子域上工作,但无论如何,您通常不希望API具有相同的身份验证(例如API密钥)。此外,HTTP内容类型解决方案不必要地过于复杂,不同版本的API可能不会使用相同的URL。您将最终进入共享URL和一些特定的URL。。。完美的混乱:我认为所有这些答案在某些方面都是对的和错的。首先,我们现在完全可以处理跨域身份验证和授权。虽然我同情本、凯尔和普洛菲特的观点,但我要挑战他们,让他们思考一下URI是什么