- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试围绕 RESTful 设计进行思考,我想从社交网络的角度来理解它。我已阅读 REST API Design Rulebook ,查看了一些其他书籍并阅读了大量在线资源。尽管如此,当将规则应用于现实世界的问题时,我意识到我并没有完全理解一切。我想通过指定一些问题来了解我是否对 REST 有正确的理解:
层次结构与平面设计
让我们假设我用
/users/42
现在,该用户上传的照片最终会在
/users/42/photos
如果他/她在照片中标记他/她的 friend ,这些标记最终会出现在
/users/42/photos/1337/tags
但这无法找到标记特定用户的所有照片。我应该为此提出不同的层次结构吗?好像有点别扭。我是否可以完全无视层次结构并结合这样的查询提供照片?
/photos?owner=42
/photos?tagged=42
当不同用户的内容不同时缓存
api
开头的子域中访问的规则。 ,在他们的例子中
http://api.soccer.restapi.org
.我曾计划对用户访问和机器访问(例如移动应用程序)使用相同的 Controller 。 Controller 将通过
text/html
决定提供哪个 View (
application/json
、
application/xml
或
Accept
) HTTP 请求头中的字段。我认为出于某种原因这将是一个坏主意(因为用户希望看到子域
www
,而不是
api
),但我不明白为什么。可以
www
和
api
指向同一台服务器,还是我真的应该尝试将 HTML View 移动到不同的虚拟主机?为什么?
Accept
提供不同的表示形式。 field 。在不同的子域之间重定向用户将违反关于提供来自同一资源的任何表示的规则,并且复制信息(即,将两个子域指向同一虚拟主机)违反关于不为同一资源提供多个 URI 的规则。不提供
api
子域违反了另一个设计规则。我怎样才能在不违反任何规则的情况下解决这个问题?
/users
是非法请求,而
/users?name=leet+hacker
将有效但仅返回例如100 项。
/users/me
但它是否应该提供与文档 URI 完全相同的信息
/users/42
还是应该重定向到它?
Accept-Language
领域,但有没有人认真考虑过在他们所属的社交网络上切换语言?所有这些信息都应该每次都返回给调用者,还是我可以依赖设置?这可以与缓存一起使用吗?
最佳答案
正如@Mark Dickinson 提到的,这里有很多问题,确实应该分开讨论,但我会尽力而为。
层次结构与平面设计
REST 中没有任何内容表明您不能拥有多个并行层次结构(尽管我知道使用 Rails 这样做很尴尬)。有 /users/42/photos/owner
和 /photos/owner/42
包含相同的集合很好。同样/users/42/photos/tagged
和 /photos/tagged/42
可以包含相同的集合。但是,此时您不必担心 URI。有一篇优秀文章A RESTful Hypermedia API in Three Easy Steps描述了如何设计你的 API。在本文中,URI 被确定为最后一步。
另外,使用 HATEOAS限制条件下,客户端应在运行时通过应用程序提供的链接和表单发现这些不同的 URI。
不同用户的内容不同时缓存
如果您要从同一个 URL 提供不同的内容,那么它将无法缓存。您可以将您的站点划分为两种类型的内容,公开的和个性化的。公共(public)内容对每个人都应该相同,并且可以缓存。每个用户的个性化内容都不同,这意味着您可以缓存它的数量将大大减少(使用您在示例中使用的 URL 格式减少到零)。
要在个性化内容上至少获得少量缓存,请按用户对内容进行分区,这样对于给定用户,您将获得一些缓存命中。例如,代替 /users/42
每个人都可以访问,使用 /<UID>/users/42
哪里是请求用户的用户 ID。例如用户 234 将使用 URI /234/users/42
访问用户 42 的个人资料页面.对于匿名用户,您可以删除 /<UID
部分或使用特定的用户 ID,例如 /public/users/42
.
从同一资源同时提供 HTML 和 JSON/XML
使用 Accept
标题。这就是它的用途。
限制发回的数据
您不需要制作 /users
非法请求。 Treat 是一个集合,并返回请求者可以查看的分页用户列表。例如,对于匿名请求,您可能会提供一个空列表(或 204 No Content)
<users/>
<users>
<user id="42" href="/users/42" name="John Doe"/>
<user id="53" href="/users/53" name="Jane Doe"/>
...
<next href="/users?page=2"/>
</users>
/users?page=2
然后您将提供下一页结果
<users>
<user id="69" href="/users/69" name="John Smo"/>
<user id="84" href="/users/84" name="Jane Smo"/>
...
<next href="/users?page=3"/>
<prev href="/users"/>
</users>
next
关联。要添加搜索功能,您只需添加一个适当的表单作为响应的一部分。
<users>
<user id="69" href="/users/69" name="John Smo"/>
<user id="84" href="/users/84" name="Jane Smo"/>
...
<next href="/users?page=2"/>
<prev href="/users"/>
<search href="/users" method="get">
<name cardinality="required" type="regex"/>
</search>
</users>
/users
列表。例如,搜索
leet hacker
(假设您有权查看系统中的许多 leet 黑客)会产生类似
<users>
<user id="234" href="/users/234" name="leet hacker"/>
<user id="999" href="/users/999" name="leet hacker"/>
...
<next href="/users?name=leet+hacker&page=2"/>
<search href="/users" method="get">
<name cardinality="required" type="regex"/>
</search>
</users>
/<UID>/users/42
,在这种情况下,您可能希望重定向
/42/users/me
至
/42/users/42
.
<image id="266" href="/photos/266" caption="leet hacker with computer"
src="http://us.123rf.com/400wm/400/400/creatista/creatista0911/creatista091100003/5827629.jpg"/>
<tagged-users>
<user id="234" href="/users/234" name="leet hacker"/>
</tagged-users>
<owner id="234" href="/users/234" name="leet hacker"/>
</image>
<image id="266" href="/photos/266" caption="leet hacker with computer"
src="http://us.123rf.com/400wm/400/400/creatista/creatista0911/creatista091100003/5827629.jpg"/>
<tagged-users>
<tagged-user id="234" href="/users/234" name="leet hacker">
<delete href="/photos/266/tagged/234" method="delete"/>
</tagged-user>
<add href="/photos/266" method="put">
<user cardinality="required" type="user-id"/>
</add>
</tagged-users>
<owner id="234" href="/users/234" name="leet hacker"/>
<delete href="/photos/266" method="delete"/>
<update href="/photos/266" method="put">
<caption cardinality="optional" type="string"/>
</update>
</image>
Accept-Language
默认语言,但允许用户在其设置中更改语言。
关于web-services - 社交网络的 RESTful 设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9314749/
我对编程真的很陌生,并且在理解 RESTful API 的概念时遇到了一些麻烦。我读过 REST 和 RESTful API。我已经查看了 SO 中已经提出的问题,但似乎无法更好地理解该主题。 在我的
我以为我知道REST /“RESTFul”,restfulservices,webservices,SOA和微服务是什么,但是我遇到了许多不同的定义,我得出的结论是这些术语被过度使用,滥用或完全错误定
我有一个列表,其中有一个“人员和组”列。当我使用 REST 查询行时,我会在此列中列出用户 ID。 我发现这篇文章将帮助我将每个 id 转换为标题 http://www.codeproject.com
我想问一些关于 REST 调用的问题。我是 REST 调用的绿色,我想了解什么是 REST 调用以及如何使用 URL 向服务器发送 REST 调用。谁能给我一些基本的教程或链接供我引用? 另外,如果我
很难说出这里问的是什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或言辞激烈,无法以目前的形式合理回答。如需帮助澄清此问题以便可以重新打开,visit the help center . 8年前关闭
如果有一个 REST 资源我想监视来自其他客户端的更改或修改,那么最好(也是最 RESTful)的方法是什么? 我这样做的一个想法是通过提供特定资源来保持连接打开,而不是在资源不(尚)存在时立即返回。
我有一个可以返回大量项目的 RESTful API,我希望能够使用分页样式技术来限制项目数量,这是 RESTful API 中的一个好主意吗? 如果有可能最好通过链接(在这种情况下为 url)或请求正
我仍然处于适应以 REST 方式做事的过程中。 在我的情况下,客户端软件将与 RESTful 服务交互。很少,客户端会上传其整个实体数据库(每个实体序列化为大约 5kb 的 xml 块)。 也许我错了
设计一个路径解析可能有歧义的 REST API 是否被认为是不好的做法?例如: GET /animals/{id} // Returns the animal with the given ID
我知道 REST 并且知道在不使用 session 的情况下创建 RESTful Web 服务,我更了解它,但我不太了解无状态的概念以及使用 REST 如何使您的应用程序可扩展 有人可以解释 REST
我正在尝试找到解决以下问题的最佳方法:我们的应用程序是SaaS,它支持Web登录的SAML。该应用程序还公开了应该在自动化和无人值守的流程中使用的REST API,这意味着没有交互式用户可以键入凭据。
由于 REST 是无状态的,因此传入的每个请求都不知道传入的前一个请求。在这种情况下是否可以使用连接池? 如果要实现连接池,它将像标准数据库连接一样在每个请求时打开连接池并关闭它。 如何实现 REST
得墨忒耳定律(真的应该是得墨忒耳的建议)说你不应该“穿过”一个物体去接触它们的子物体。如果您作为客户需要执行一些重要的操作,大多数情况下您使用的域模型应该支持该操作。 REST 原则上是一个愚蠢的对象
我唯一真正接触到 REST 的想法已经通过 Ruby on Rails 的 RESTful routing .这非常适合我使用 Rails 构建的基于 CRUD 的应用程序,但因此我对 RESTful
有什么好处 http://www.example.com/app/servlet/cat1/cat2/item 网址 超过 http://www.example.com/app/servlet?c
我知道以前有人问过这类问题。我有我的问题的解决方案,我想知道我是否在任何地方破坏了 REST 或 HTTP 主体。 在我的系统中,我有一个名为 member 的资源。支持通常的GET/POST/PUT
我有一个API,可以执行一些批量处理任务。假设它确实为某些资源命名。 我批量传递了7个请求,其中5个更新成功,2个失败。 我的问题是如何应对。使用HTTP时,我无法同时返回成功和错误。 有一个部分成功
我来自 RPC 世界,但目前正在调查使用 REST 是否适合我的项目。至于据我了解 Wikipedia RESTful 服务的基本思想是提供对集合及其各个元素的访问。 在我的情况下,服务器将是一个测量
我想将REST添加到我的挂毯项目中,因此需要知道如何实现它。 有什么更好的方法? 谢谢。 [编辑,从答案中复制:]我必须将GET,PUT,POST和DELETE服务添加到我的挂毯应用程序中。我看到Ta
让 /users/{id}成为 RESTful 服务中的资源 url。 启用基本身份验证,只有经过身份验证的用户才能访问该 url。 示例场景: User_1 & User_2是经过身份验证的用户,用
我是一名优秀的程序员,十分优秀!