RESTful API:为什么不为集合和项目只使用一个基本URL?

RESTful API:为什么不为集合和项目只使用一个基本URL?,api,rest,Api,Rest,我和一位朋友讨论了RESTful API,他问为什么它对集合和项目使用两个基本URL(/dogs和/dogs/1234),而不是像其他任何东西一样使用带有查询参数的单一URL(/dogs和/dogs?id=1234) 经过进一步的讨论,我意识到我不能提出一个不基于美学原因的论点(这意味着URL看起来更像/dogs/1234,而不是/dogs?id=1234) 您可以有一个基本URL来处理资源的集合和单个项,但在这种特殊情况下,您使用非查询参数(/1234而不是?id=1234)来引用资源似乎有些

我和一位朋友讨论了RESTful API,他问为什么它对集合和项目使用两个基本URL(
/dogs
/dogs/1234
),而不是像其他任何东西一样使用带有查询参数的单一URL(
/dogs
/dogs?id=1234

经过进一步的讨论,我意识到我不能提出一个不基于美学原因的论点(这意味着URL看起来更像/dogs/1234,而不是/dogs?id=1234)

您可以有一个基本URL来处理资源的集合和单个项,但在这种特殊情况下,您使用非查询参数(/1234而不是?id=1234)来引用资源似乎有些奇怪

这让我不禁要问,是否有一个特定的、非审美的理由来为一个资源使用两个基本URL,而不是在RESTful API中使用一个

  • 我考虑过的一件事是,像/dogs/1/fleals/10这样的嵌套资源看起来很笨拙,但使用单个基本URL(/dogs?id=1&fleal_id=10)仍然可行

URI设计只是REST API的一个很小的部分,尽管考虑到谈论它所花费的时间,您可能会认为它是REST-ful的唯一特点。身份验证、内容类型、响应代码、方法类型(get、POST、PUT、DELATE、OPTION)、发现能力和缓存策略是更重要的事情。
但是,在考虑查询字符串是否合适时,首先确定它们是否能够在不改变资源状态的情况下准确地表示资源的状态。同一资源(您的狗)是否可以在该位置使用该URI(假定总是)进行标识?由于您选择了一个ID为的查询字符串,而不是在路径中表示ID,该狗会以某种方式改变吗?不,它不会,这就是为什么在这种情况下查询字符串是好的。事实上,这两种方法都可以。

URI设计只是REST API的一个很小的部分,尽管考虑到谈论它所花费的时间,您可能会认为它是REST-ful的唯一特点。身份验证、内容类型、响应代码、方法类型(get、POST、PUT、DELATE、OPTION)、发现能力和缓存策略是更重要的事情。
但是,在考虑查询字符串是否合适时,首先确定它们是否能够在不改变资源状态的情况下准确地表示资源的状态。同一资源(您的狗)是否可以在该位置使用该URI(假定总是)进行标识?由于您选择了一个ID为的查询字符串,而不是在路径中表示ID,该狗会以某种方式改变吗?不,它不会,这就是为什么在这种情况下查询字符串是好的。事实上,任何一个都可以。

嵌套的资源,如你所想,也可以说是一个美学问题。正如你所想的那样,嵌套的资源也可以说是一个美学问题。不管它是否是RESTAPI的重要组成部分,如果我不得不猜测的话,我会说这个约定是因为RubyonRails而开始的。据我所知,他们的MVC实现是URI约定最受欢迎的早期采用者之一。这两个人携手并进,其他人也开始效仿他们。虽然它不是什么“新”东西,但开发人员肯定给了它一种主流的吸引力。路径分隔符(即斜杠)可以表示层次数据,而查询组件不能。所以它更容易表示导航关系。例如,
/dogs/1234/owner
表示狗1234的所有者集合。在处理以下面的对象表示的数据时,它有更好的工作趋势。但这绝不是唯一的方法。我想我很好奇为什么会开发这个约定,不管它是否是REST API的重要组成部分。如果我不得不猜测的话,我会说这个约定是因为Ruby on Rails而开始的。据我所知,他们的MVC实现是URI约定最受欢迎的早期采用者之一。这两个人携手并进,其他人也开始效仿他们。虽然它不是什么“新”东西,但开发人员肯定给了它一种主流的吸引力。路径分隔符(即斜杠)可以表示层次数据,而查询组件不能。所以它更容易表示导航关系。例如,
/dogs/1234/owner
表示狗1234的所有者集合。在处理以下面的对象表示的数据时,它有更好的工作趋势。但这绝不是唯一的办法。