是否存在任何真实的Web服务,就Fielding的论文(内容协商,超媒体等)而言,它实际上是100%RESTful.我希望更好地掌握REST,并且需要从Restfulie等自动客户端使用的东西.到目前为止我声称是RESTful的所有东西似乎都是RPC或HTTP CRUD.
我正在WOA/HATEOAS寻找一个具体的例子!
我阅读了很多博客,看了很多关于HATEOAS的演讲,但从来没有一个例子......
你如何实现客户端?
真的,当你用Backbone,AngularJS,Ember,Knockout制作HTML5应用程序时......你怎么能做出HATEOAS?
在Backbone中,例如如何动态设置模型的"url"属性从服务器检索资源?
感谢各位回复!
最好的祝福,
托马斯庞斯.
有没有人有任何使用SailsJS实现HTML5超媒体(HATEOAS)API的好例子,或者这甚至是个好主意?如果没有,为什么不呢?
使用spring数据REST我公开了一个ProjectRepository支持列出项目并对它们执行CRUD操作的方法.当我去的时候,http://localhost:8080/projects/我得到了我期望的项目清单.
我要做的是将自定义操作添加到_linksProject Collection的JSON响应部分.
例如,我希望调用http://localhost:8080/projects/返回这样的内容:
{
"_links" : {
"self" : {
"href" : "http://localhost:8080/projects/{?page,size,sort}",
"templated" : true
},
"search" : {
"href" : "http://localhost:8080/projects/search"
},
"customAction" : {
"href" : "http://localhost:8080/projects/customAction"
}
},
"page" : {
"size" : 20,
"totalElements" : 0,
"totalPages" : 0,
"number" : 0
}
}
Run Code Online (Sandbox Code Playgroud)
凡customAction在某些控制器进行定义.
我试过创建以下类:
public class ProjectCollectionResourceProcessor implements ResourceProcessor<Resource<Collection<Project>>> {
@Override
public Resource<Collection<Project>> process(Resource<Collection<Project>> listResource) {
// code to add the links …Run Code Online (Sandbox Code Playgroud) 想象一下,我有一个完全实现的REST API,它也提供了HATEOAS.
假设我浏览了根,除了自我链接之外,还返回了两个其他链接(例如一个for /users和one for /orders).据我所知,HATEOAS消除了对带外信息的需求.客户应该如何知道什么users意思?语义存储在哪里?
我知道这是一个愚蠢的问题,但我真的很想知道.
在使用基于Spring Data Rest或HATEOAS的基于超媒体的微服务时,试图找出如何处理关系的模式.
如果您有服务A(讲师)和服务B(课程),则每个都作为独立应用程序存在.
建立两种服务之间关系的首选方法是什么.以不需要外部服务的ID列的方式.每个服务都有可能拥有许多需要在同一庄园中进行通信的其他服务.
可能的解决方案(不确定正确的路径)
每个服务都有一个第二个表,其中OneToMany与服务中的主要实体相对应.该表将包含以下字段:
ID,entityID,rel,relatedID
然后在使用Spring Data Rest设置的相反服务中查找查询连接表以查找匹配的记录.
我想要实现的主要目标是任何服务都可以与任何数量的其他服务建立关系,而无需了解其他服务.
我有一个使用HAteoas的Rest-Service,以前没有分页的工作.现在我正在制作可分页的Json.我用Spring-Hateoas的开箱即用功能做到了这一点.但现在我正在坚持消费它,我想它确实没有很好的记录,如果是的话.
我的JSON如下所示:
{
"_embedded": {
"vertragResourceList": [
{
"identifier": 728,
"auszubildender": "Rumm",
"beruf": "Landwirt/in",
"betrieb": "Mitterbauer Johann",
"betriebsNummer": "e12d0949-67ae-4134-9dc2-fb67758b6b16",
"zustaendigeStelle": "Irgendwo",
"beginn": 529887600000,
"status": "RECENT",
"fachrichtung": null,
"schwerpunkt": "Grünland oder Ackergras",
"ende": 623113200000,
"_links": {
"self": {
"href": "http://localhost:8080/bbsng-app-rest/vertrag/728"
}
}
},
{
"identifier": 803,
"auszubildender": "Gossen",
"beruf": "Landwirt/in",
"betrieb": "Beer Johann",
"betriebsNummer": "d5a20cb9-7273-4b75-85bd-f8e7d6a843c4",
"zustaendigeStelle": "Woanders",
"beginn": 278118000000,
"status": "RECENT",
"fachrichtung": null,
"schwerpunkt": "Ackerfutterbau",
"ende": 339116400000,
"_links": {
"self": {
"href": "http://localhost:8080/bbsng-app-rest/vertrag/803"
}
}
}
]
},
"page": {
"size": …Run Code Online (Sandbox Code Playgroud) 看到HATEOAS和微服务如何共存,我遇到了一些麻烦.
我们来举个例子:
假设我们有购物车资源.我们需要将产品的快照放入其中,例如产品ID,产品价格; 项目添加到购物车时的当前价格快照,以及可能的其他一些值.实际的用例并不重要,只是为了对手头的问题有所了解.
当我之前做过HATEOAS时,我会在购物车资源中放置链接到产品的链接或链接到特定产品的模板URL.
这样,客户端仍然可以不知道资源URL.
但在微服务领域,服务应该不了解其他服务.据我所知.
那他们怎么可以一起工作呢?
我对微服务的解释是,它们永远不能链接到除了它们之外的任何东西,这几乎就是一个Self链接.
我在其他地方发现了同样的问题,例如 https://groups.google.com/forum/#!topic/api-craft/YRkLFVY_zFc
使用诸如"宏观服务"之类的解决方案将所有这些组织在一起.这似乎不是解决问题的干净方法.
[编辑]
我发现了一些关于这个主题的更好的信息:https : //github.com/Netflix/eureka https://github.com/RestExpress/HyperExpress
这似乎很好,有一些工具使用链接来扩充资源,但这让我想到,决定资源应该属于什么链接的逻辑在哪里?在公开资源的服务中?在中央服务注册中心?
这是RESTful API的后续问题:我应该在哪里编写工作流程?问题的简短摘要(适合我的问题更好)将是这样的:
每个域对象包含与特定有界上下文(X)中的特定对象相关联的业务逻辑.REST API包含将查询或命令的结果转换为通过线路发送的数据的逻辑(例如JSON).当使用HATEOAS和超媒体时,我们希望使用链接建模资源之间的关系.但是为了确定REST API应该返回哪些链接,通常需要求助于业务逻辑/规则.问题是,这些"工作流程规则"属于DDD应用程序的位置?他们是否可能处于不同的有限上下文中,只处理工作流规则(可能与X的"伙伴"式关系)或者它们是否属于X BC?
如果你有一个REST API是hypermedia-driven(HATEOAS),你可以很容易地通过包括或省略响应链接更改客户端的行为(_links).这使客户端能够完全忘记测试当前状态resource(可存在或不存在操作的链接)的操作权限.
此外,如果当前用户没有查看权限,您可以在响应中省略属性.
这样,授权完全在服务器上完成(并控制有资格执行/查看的操作和属性).
但是,如果我想拥有一个read-only房产怎么办?REST API如果属性存在于请求(_POST_OR _PUT_)中,则忽略该属性是没有问题的.它不会得到保存.但客户端如何区分写入和只读属性以向用户显示适当的控件(如禁用的输入字段HTML)?
目标是永远不会拥有client request用户的权限,而是拥有完全由资源驱动的权限client/frontend.
任何帮助是极大的赞赏 :-)
hateoas ×10
rest ×7
hypermedia ×5
api ×1
backbone.js ×1
client ×1
consumer ×1
html5 ×1
java ×1
sails.js ×1
spring-cloud ×1
spring-data ×1
spring-mvc ×1