所以到现在为止我已经明白我们都应该实现我们的RESTful服务,提供表示,使客户能够遵循HATEOAS原则.虽然理论上这一切都很有道理,但我一直在网上搜索一些严格遵循这个想法的客户端代码的好例子.
我读的越多,我就越开始觉得这是一次学术讨论,因为没有人真正这样做!人们可以呻吟所有他们喜欢的WS-*堆栈的许多缺陷但至少很清楚如何编写客户端:你可以解析WSDL并生成代码.
现在我明白这对于一个好的RESTful服务来说不是必需的:你应该只需要知道所涉及的关系和表示,你应该能够动态地对这些做出反应.但即使如此,现在这个原则是不是应该被提炼出来并抽象成一些常见的库?提供有关您可能收到的表示和关系的信息,并获得可在您的应用程序中使用的更有用的更高级代码?
这些只是我的半生不熟的想法,但我只是担心如果我现在潜入并编写一个正确的RESTful API,实际上没有人能够使用它!或者至少使用它会在背后造成这样的痛苦,因为人们将不得不编写胶水代码来解释我提供的关系和表示.
任何人都可以从客户的角度阐明这一点吗?有人可以展示一个正确的动态/反应式RESTful客户端代码示例,这样我就可以了解我实际上正在为之写作的受众吗?(更好的是提供一些抽象的客户端API的一个例子)否则它的所有理论......
[编辑:请注意,我在这里发现了一个类似的问题,我认为这个问题没有得到回答,作者被一个维基百科的存根所取代!]
问题是,Spring HATEOAS与Spring Data Rest之间有什么区别?
我觉得两者都可以这样做,Spring Data Rest(作为Spring Data的一部分)看起来更有活力.
https://github.com/spring-projects/spring-hateoas https://github.com/spring-projects/spring-data-rest
你什么时候使用其中一个?
为了简单起见并避免命名冲突,我一直在我的记录资源中捆绑链接......
{
id: 211,
first_name: 'John',
last_name: 'Lock',
_links: [
{ rel: 'self', href: 'htttp://example.com/people/211' }
]
}
Run Code Online (Sandbox Code Playgroud)
但是,我无法弄清楚如何在集合中实现链接.我花了很长时间在网上搜寻一些例子,除了使用不那么精益的HAL,我无法调和我的问题.
[
{id:1,first_name:.....},
{id:2,first_name:.....},
{id:3,first_name:.....},
"_links": "Cant put a key value pair here because its an-array"
]
Run Code Online (Sandbox Code Playgroud)
这意味着我必须将数组包装在容器对象中.
[
people: [ {id:1,first_name:.....} ],
links: [ { rel:parent, href:.... ]
]
Run Code Online (Sandbox Code Playgroud)
但是与单数资源不同,所以我要使记录表现得像集合并将其包装在一个容器中....
{
person: {
id: 211,
first_name: 'John',
last_name: 'Lock',
_links:
},
links:[
{ rel: 'self', href: 'htttp://example.com/people/211' }
]
}
Run Code Online (Sandbox Code Playgroud)
从表面上看,这似乎是一个非常简洁的解决方案.由此产生的JSON更深一层,但HATEOAS已经实现,所以这一切都很好吗?一点也不.当我回到收藏品时,真正的刺痛来了.既然单个资源已经包装在容器中以便与集合保持一致,那么现在必须更改集合以反映更改.这就是丑陋的地方.十分难看.现在这个系列看起来像这样......
{
"people": [
{
"person": {
....
}, …Run Code Online (Sandbox Code Playgroud) 我正在设计一个REST api并且像它一样成为RESTful.我想将HATEOAS合并到json响应中.
将URL添加到相关资源很容易,但是对于用于这些链接的结构进行了一些讨论.
我发现很多文章使用从ATOM提要借来的结构:
"links": [
{"rel": "self", "href":"http://example.org/entity/1"},
{"rel": "friends", "href":"http://example.org/entity/1/friends"}, ...
]
Run Code Online (Sandbox Code Playgroud)
这提出了一些问题:
为什么使用数组作为容器?根据我所知道的javascript开发人员,使用链接作为对象的属性,访问链接会更容易.例如:
"self": { "href":"http://example.org/entity/1" }, /* (facebook uses this) */
"friends": { "href":"http://example.org/entity/1/friends", "type": "..."}
Run Code Online (Sandbox Code Playgroud)是否有一个共同的json结构(在再次调整原子旁边)来描述资源属性中的引用?(例如消息的发件人).
该引用可能应该再次作为URL解析,但是包含简单ID也不好吗?有一些像:
"sender": {
"id": 12345,
"href": "resource-uri"
}
Run Code Online (Sandbox Code Playgroud)我的想法是,虽然HATEOAS使得客户端不需要很多知识来使用API,但我不愿意消除使用该知识的可能性(比如通过构建链接来访问配置文件图片)客户端没有先查找用户).
我想使用查询参数设计RESTful搜索URI.例如,此URI返回所有用户的列表:
GET /用户
前25名用户名为"Harvey":
GET/users?surname = Harvey&maxResults = 25
如何使用超媒体来描述"/ users"资源允许的查询参数?我注意到新的Google Tasks API只记录了参考指南中的所有查询参数.我会记录清单,但我也想用HATEOAS来做.
先感谢您!
我现在正在玩REST,并认为我正确地实现了HATEOAS,只是为了让所有概念都正确.
为此,我想创建自己的媒体类型(application/vnd[...]+xml和application/vnd[...]+json).
第一个问题:媒体类型是否定义了我的服务器和客户端之间的合同?
媒体类型将定义我的消息格式,因此我需要添加XML模式和JSON模式以配合新的媒体类型(以便REST客户端知道消息中的内容以及要发回的内容).
我已经在网上做了一些研究,但缺少一个人如何做到这一点的细节.它是否只涉及编写详尽的规范/文档或是否有一些技术步骤来实现?(我不需要在IANA注册吗?)
如何application/vnd创建一个全新的功能 - 媒体类型?你需要照顾什么才能让客户正确使用它?
我现在正在阅读"实践中的休息"一书.我无法理解以下术语超媒体,超媒体格式,超媒体控件,域应用程序协议.作者建议需要特定于域的超媒体格式.我很难理解那些.我搜索了这些条款,但无法找到正确的答案.任何人都可以解释这些术语以及为什么我们需要特定于域的超媒体格式而不是application/xml?
我想知道Angular中是否隐藏了某些功能,或者某些第三方库是否可以轻松创建与HATEOAS兼容的Restful客户端.
在后端,我使用Spring Data/REST生成HATEOAS JSON API.然而,消费它是另一个故事.
例如,我有这3个实体:
{name, address} {firstName, lastName, employer[Company]} {rate, day, employee[Employee], client[Company]}并请求一个活动(模型中最复杂的实体)产生这样的东西:
{
links: [],
content: [{
rate: 456,
day: 1366754400000,
links: [{
rel: "self",
href: "http://localhost:8080/api/activities/1"
},
{
rel: "activities.activity.client",
href: "http://localhost:8080/api/activities/1/client"
},
{
rel: "activities.activity.employee",
href: "http://localhost:8080/api/activities/1/employee"
}]
}]
}
Run Code Online (Sandbox Code Playgroud)
我的API就REST而言(由链接标识的资源).例如,一个Activity有一个Employee.我真正想要使用的是:{rate: 456, day: 1366754400000, employee: {firstName:"xxx", lastName:"xxx" ...}}.
但是,正如您在第一个输出中看到的,我的Activity仅包含指向员工的链接,而不是其数据.Angular或第三方库中是否有任何内容可以解析这些链接并嵌入生成的数据?
有什么输入吗?
提前致谢!
假设我有两个存储库:
@RepositoryRestResource(collectionResourceRel = "person", path = "person")
public interface PersonRepository extends PagingAndSortingRepository<Person, Long> {
List<Person> findByLastName(@Param("name") String name);
}
Run Code Online (Sandbox Code Playgroud)
和
@RepositoryRestResource(collectionResourceRel = "person1", path = "person1")
public interface PersonRepository1 extends PagingAndSortingRepository<Person1, Long> {
List<Person1> findByLastName(@Param("name") String name);
}
Run Code Online (Sandbox Code Playgroud)
使用一个常规控制器:
@Controller
public class HelloController {
@RequestMapping("/hello")
@ResponseBody
public HttpEntity<Hello> hello(@RequestParam(value = "name", required = false, defaultValue = "World") String name) {
Hello hello = new Hello(String.format("Hello, %s!", name));
hello.add(linkTo(methodOn(HelloController.class).hello(name)).withSelfRel());
return new ResponseEntity<>(hello, HttpStatus.OK);
}
}
Run Code Online (Sandbox Code Playgroud)
现在,回复http://localhost:8080/是:
{
"_links" : …Run Code Online (Sandbox Code Playgroud) 我正在阅读有关HATEOAS的文章,虽然我理解为响应中的进一步操作提供URL的想法,但我没有看到您在何处指定应使用哪些HTTP谓词与这些URL进行交互.
例如,什么是HATEOAS,为什么它对我的REST API很重要?,如何从这个回应
GET /account/12345 HTTP/1.1
HTTP/1.1 200 OK
<?xml version="1.0"?>
<account>
<account_number>12345</account_number>
<balance currency="usd">100.00</balance>
<link rel="deposit" href="/account/12345/deposit" />
<link rel="withdraw" href="/account/12345/withdraw" />
<link rel="transfer" href="/account/12345/transfer" />
<link rel="close" href="/account/12345/close" />
</account
Run Code Online (Sandbox Code Playgroud)
你知不知道我是否应该发出HTTP PUT或POST来/account/12345/close?
hateoas ×10
rest ×9
hypermedia ×2
json ×2
spring ×2
web-services ×2
angularjs ×1
client ×1
controls ×1
java ×1
media ×1
spring-boot ×1