【问题标题】:Advantages of REST URI over URI of querystring format?REST URI 或查询字符串格式的 URL 的优点?
【发布时间】:2026-02-18 04:45:02
【问题描述】:

全部,

对于一个使用 .NET 开始的新项目,我们想练习纯 REST。因此,我们选择了作为 .NET Framework 4.5(而不是 WCF)的一部分发布的 .NET Web API,考虑到它支持纯 REST 特性。但是当我们根据我们的需求进行更多探索时,我们意识到它没有提供类似 REST 的 URL 格式的 URI 模板支持。我们仍然可以,因为我们对 WebAPI 具有查询字符串类型的格式并没有感到很糟糕。

当我们聘请了一个新团队时,他们开始强制要求他们只需要 REST 类型的 URL 格式,因为它是标准规范并且喜欢。

当被问及执法时,他们只是提到这是一个标准,我们必须遵守它,这并没有让我信服。

那么,我很想知道 REST 架构开箱即用提供了什么?还有查询字符串格式的 URI 不符合 REST 方法的条件吗?

REST URI:http://myapplicationdomain.com/apps/appId

查询字符串 URI:http://myapplicationdomain.com/GetAps/appId={appId}

提前致谢。

【问题讨论】:

    标签: c# asp.net wcf rest asp.net-web-api


    【解决方案1】:

    REST 不只是 URL 格式,REST 不限制您使用参数。

    REST 哲学的一部分是识别资源,因此您的资源 具有 URL,并且 HTTP 动词(Get、Post、Delete、Put 等)定义 em>对该资源的操作。 你仍然可以使用参数,例如

    http://myappfomain.com/product/?page=1&pageSize=10

    这是对产品列表的 GET 请求(因为未指定 ID),并且在查询字符串中指定了分页/排序标准。这是完全正确的。

    或者

    http://myappdomain.com/product/123/?format=json

    在这里您使用 ID od #123 访问产品,但请求将其作为 JSON 返回。也不错。

    从这个角度来看,资源拥有自己的 URL 更符合逻辑。参数可能会添加一些细节。

    这样看: URI 定义了主题 HTTP 动词定义操作(做什么) 查询参数提供了一些细节(怎么做)

    希望对你有帮助。

    【讨论】:

      【解决方案2】:

      URI 的 REST(参见 wiki Representational state transfer)“样式”的存在是有原因的。维基摘录:

      统一界面
      ...
      资源识别 单个资源在请求中被识别,例如在基于 Web 的 REST 系统中使用 URI ....

      通过这些表示来操作资源当客户端持有资源的表示时,......它有足够的信息来修改或删除服务器上的资源......

      我使用这些引用很好地解释了一个事实,即 URI 的 REST 样式实际上是关于 resource 标识的。我们可以有

      1) 数据库中的表和
      2) 一个 ID 列,它允许
      3) 更新或删除记录。

      REST 中的 URI 也是如此:

      1) 识别资源类型(实体/表)
      2) 识别资源ID
      3) 设置操作

      HTTP Method       URI                        Operation
      GET               \ResourceType\ResourceId   SELECT, READ
      POST              \ResourceType              INSERT, Add, create new
      PUT               \ResourceType\ResourceId   UPDATE the record with ResourceID
      DELETE            \ResourceType\ResourceId   DELETE that record
      

      我们可以看到,REST URI 样式在资源管理的完整上下文中确实有意义

      【讨论】:

      • PUT 也可以在客户端控制 ResourceId 的值的情况下插入,POST 用于在服务器指示资源 id 的值时插入(因此新资源的 id插入时客户端不知道)。
      • 我们如何使用 PUT 或 POST 与事实无关,REST api URI 样式在这里是有原因的。识别资源
      • 我的意思不是关于 URI 样式,而是您的带有示例的表格的描述不完整。 PUT to \ResourceType\ResourceId 也可用于插入由 ResourceId 标识的记录。
      • 不要误会我的意思。我同意你的意见。您的扩展是正确的,它确实符合 REST 定义。我的回答主要针对为什么使用 URI 的 REST 样式的原因的解释......
      • 好吧,让我们同意...同意... :-)