正如@voicesofunreason所说,在HATEOAS中,URI是可发现的(并且没有文档化),因此可以更改它们。也就是说,除非它们是进入系统的入口点(很酷的URI,唯一可以由客户机硬编码的URI)--如果您希望将来能够改进系统URI结构的其余部分,那么就不应该有太多的入口点。这实际上是REST最有用的特性之一。
对于剩余的非酷URI,它们可以随着时间的推移而更改,您的API文档应该详细说明应该在运行时通过超媒体遍历发现它们。
看看理查森的成熟度模型(第3级),这将是链接发挥作用的地方。例如,从顶层,例如/api/version(/1),您会发现有一个到组的链接。以下是在HAL Browser这样的工具中的外观:
{
"_links": {
"self": {
"href": "/api/root"
},
"api:group-add": {
"href": "http://apiname:port/api/group"
},
"api:group-search": {
"href": "http://apiname:port/api/group?pageNumber={pageNumber}&pageSize={pageSize}&sort={sort}"
},
"api:group-by-id": {
"href": "http://apiname:port/api/group/id" (OR "href": "http://apiname:port/api/group?id={id}")
}
}
}
{
"groups": [
{
"id": 123,
"name": "Test Group"
},
{
"id": 134,
"name": "Tennis squad"
}
]
}
然后,一旦你深入到一个特定的群体(比如#123):
{
"Id" : 123,
"Name" : "test",
"_links": {
"self": {
"href": "/api/group/1" (OR "/api/group?id=1")
},
"edit": {
"href": "http://apiname:port/api/group/1"
},
"api:delete": {
"href": "http://apiname:port/api/group/1"
},
"api:items-query": {
"href": "http://apiname:port/api/bonus?groupId=1"
}
}
}
在这里,编辑只是一个PUT,然后您需要一个DELETE(请参见同一链接中的REST级别2),对于项,您可能最清楚它们是一个属性还是另一个endpoint;您甚至可以将它们嵌入到检索组的同一个调用中返回。
这里的优点是客户机只需要知道关系(链接)名称(显然除了资源结构/属性之外),而服务器基本上可以自由地更改关系(和资源)URL。
我有一个带有ui路由器的AngularJS应用程序,它使用带有超媒体的REST API。一般的想法是让API为其各种调用生成URL,并防止客户机自己构造URL。 还有别的想法吗? 除非我在这方面非常错误,否则我不是在寻找模板化的解决方案,即API返回一个url模板的解决方案,该url模板需要客户机注入参数。关键在于url已经填充了数据,因为有些url比上面提供的示例要复杂得多。
我现在正在读《实践中的Rest》一书。我无法理解以下术语超媒体,超媒体格式,超媒体控件,域应用协议。作者建议需要特定领域的超媒体格式。我很难理解这些。我在谷歌上搜索了这些术语,但没有找到正确的答案。谁能解释一下这些术语,以及为什么我们需要特定于领域的超媒体格式而不是应用程序/XML?
超媒体点击事件的监听 超媒体消息的点击事件包括:点击打开链接url和点击打开app的原生页面;其中点击打开url链接使用setOnHyperUrlListener接口,方法如下: Ntalker.getInstance().setOnHyperUrlListener(new OnHyperUrlListener() { @Override public void OnOpenHyp
我有一个应用程序,可以显示来自互联网的图片和视频。现在我正在实现一个“保存”功能,将图片/视频保存到外部或内部存储器中,无需再次下载。 对于图片,我只是用抓取绘图。我如何用Exoplayer2. x/PlayerView中当前缓冲的视频实现同样的效果?我没有找到一个函数。
当我使用以下命令运行11应用程序时: 遇到以下错误: 根据我的理解,这个异常是我的模块设置有问题,但我不清楚需要更改什么: 向以及哪些? 添加到模块使用的命令 完全不同的东西?
/** 是否开启超媒体吸底功能(默认开启) @param enableSnap enableSnap */ [Ntalker ntalker_setEnableSnap:NO];