language-agnostic - 多个资源的 REST 接口(interface)使用

标签 language-agnostic http rest

我目前正在通过 http 添加 REST API 到在线服务,我遇到了一个非常简单的问题,但我找不到令我满意的答案:

我主要有 2 个资源:“用户”和“报告”,正如您所猜测的那样,报告与用户相关联(与一个且仅一个,= 我的数据库中的外键)

无论如何,我有 GET 的 url 映射:

  • mywebsite/api/users/{id} :返回用户及相关信息,如果 id 不存在,则返回用户列表
  • mywebsite/api/report/{id} :返返回告和相关信息,如果 id 不存在,则返返回告列表

现在我想获取特定用户的报告,我现在的方法是向报告的 GET 方法添加一个可选参数:?username={username } 如果它存在,我将过滤结果以仅返回该用户的报告。

我情不自禁地认为出了什么问题...如果我开始做这样的事情,我将让我的方法处理 GET 充满 if/else 寻找丢失的参数...

我想到的其他解决方案是:

  • 将报告合并到 mywebsite/api/users/{id} 上生成的 GET 中,但我有很多报告,所以最终会变得非常糟糕。 ..
  • 专门为此功能映射另一个网址,但感觉不太对...

我刚刚掌握了 REST 的概念,我喜欢这个概念,但对这个问题的一些解释确实可以帮助我更好地理解它。

谢谢

编辑:

看来我遇到了 REST 世界中的一个常见问题,我将我的资源绑定(bind)到了一个模型。如果将资源与模型绑定(bind),您最终会在聚合属性方面遇到麻烦。 有人在这里描述了这个错误http://jacobian.org/writing/rest-worst-practices/但我还不明白如何按照他所说的那样进行管理......

仅供引用,我正在使用 django/piston,但无论使用任何语言,这个问题都应该是可以回答的。

最佳答案

I can't help but think something is wrong...

您做错的唯一一件事是认为您的 URI 结构使您的应用程序或多或少是 RESTful 的。 original REST literature从来没有说查询字符串不好。人们往往对 URI 结构很着迷,并且似乎认为您的 URI 必须以某种方式构建才能被视为 RESTful。使用 ?username=<username> 没有任何问题。 URI 只是一个 ID (尽管有些可能比其他的更人性化)

底线:不要太在意 URI 外观。还有很多更重要的事情需要关注(促进超链接/超媒体、坚持统一的接口(interface) - 通常是 HTTP、可缓存性等)。

这可能是一个很大的题外话,但是,至于您对资源与模型耦合的评论,您仍然没问题。如果您确实选择了/reports/ID/user 路线,只需将“user”视为报告模型上的关系名称即可。当然,您的模型定义了报表和用户之间的关系。您可以只解析 URI 的最后部分,使其与该关系的名称匹配。在像您描述的一对一关系的情况下,设置 Content-Location 总是一个好主意。 header 以匹配用户的规范 URI。

例如。假设报告 123 属于用户 1。您现在有两种方式引用该用户:

http://example.com/reports/123/user
http://example.com/user/1

对于第一个 URI,设置 Content-Location: http://example.com/user/1 也是一个好主意。标题

关于language-agnostic - 多个资源的 REST 接口(interface)使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2204509/

相关文章:

language-agnostic - 从 "Atoms"构建 OOP 编程语言

javascript - 流与可观察对象

language-agnostic - 像node.js一样的命令行进度条

PHP session HTTP到HTTPS问题

web-services - REST 请求 header 是否由 SSL 加密?

language-agnostic - Map Reduce 框架/基础设施

c# - 如何避免Webclient下载0字节文件错误

javascript - 如何将网页快照及其所有元素(css、js、图像等)保存到一个文件中

c# - 如何使用 .Net 2 C# 的 REST API 实现 Azure 表服务的批量启动

c# - 如何在 Azure 中列出经典虚拟机