我已经读了很多有关如何正确设置微服务的文章,并且一直对一些较新的概念感兴趣,包括:HAL,ALPS和HAL浏览器。我曾经使用Swagger UI记录过东西,但是,我开始明白以URL为中心不是正确的方法,我应该围绕资源和链接来组织文档,这是新技术的目的。关于这些较新的概念,我有很多知识上的空白,因此我想对这些技术如何协同工作有一个适当的了解,以便在我了解每种技术时可以使它们适应这个难题。

我目前的理解是:

HAL-是JSON之上的另一种格式,可让您通过链接浏览API。

ALPS-这是JSON之上的另一种格式,可以让我提供基于英语的描述来帮助描述我的资源

HAL浏览器-Swagger UI替代以资源和链接为中心的文档。可以同时使用HAL和ALPS吗?

我目前对这些技术的理解在某些方面是准确的还是缺乏的?同样在实现方面,我还没有完全理解ALPS和HAL是如何相互作用的。我知道hal + json格式和alps + json格式,但是我还没有看到hal + alps + json格式。

我要澄清的最后一个领域是我应该如何公开这些资源。通常,我一直非常关注非常精简的json消息,它会按预期发送hal + json格式,还是应该将那些终结点托管在另一个URL上,专门用于类似于swagger/HAL浏览器的文档?

最佳答案

伙伴!您尝试在此处了解的信息 hell 。让我尝试逐步解释。

以文档为中心意味着在服务和服务之间进行转换,是的,它应被称为在网络上语义上共享信息(或理解为数据类型)。

步骤:1
用于具有数据类型元数据和标准数据类型的服务的协议(protocol)(http)可以是任何形式的超媒体,即HTML,XML,JSON,HAL等。
例如下面显示的JSON,它是带有链接的根文档。 “待办事项”和“配置文件”都只是基于HAL的超媒体链接,而HAL仅会扩展您当前的API。

{ "_links" : {
    "todos" : {
      "href" : "http://localhost:8080/todos"
    },
    "profile" : {
      "href" : "http://localhost:8080/alps"
    }
  }
}

请注意,它只是与可能指向资源语义的资源链接进行链接。 HAL的主要重点只是通过链接,属性和/或嵌入来链接资源/模板。
上面介绍的流量主要是协议(protocol)级别的链接共享数据类型。

步骤:2
ALPS是应用程序级别的功能,这在上面的JSON中意味着我知道Todo是什么,但如何与之交互?要与Todo进行交互,需要具有应用程序级别的状态转换。
考虑下面的“todo” JSON,它从链接导航并显示详细的额外关键字,例如“描述符”和“类型”(SEMANTIC,SAFE,UNSAFE等)。

'id'属性成为表示标识符。设置这些或规则以应用独立的ALPS状态和转换。
{ "version" : "1.0",
  "descriptors" : [ {
    "id" : "todo-representation",
    "descriptors" : [ {
      "name" : "description",
      "doc" : {
        "value" : "Details about the TODO item",
        "format" : "TEXT"
      },
      "type" : "SEMANTIC"
    }, {
      "name" : "title",
      "doc" : {
        "value" : "Title for the TODO item",
        "format" : "TEXT"
      },
      "type" : "SEMANTIC"
    }, {
      "name" : "id",
      "type" : "SEMANTIC"
    } ]
  }, {
    "id" : "get-todos",
    "name" : "todos",
    "type" : "SAFE",
    "rt" : "#todo-representation"
  }, {
    "id" : "create-todos",
    "name" : "todos",
    "type" : "UNSAFE",
    "rt" : "#todo-representation"
  }, {
    "id" : "delete-todo",
    "name" : "todo",
    "type" : "IDEMPOTENT",
    "rt" : "#todo-representation"
  }, {
    "id" : "patch-todo",
    "name" : "todo",
    "type" : "UNSAFE",
    "rt" : "#todo-representation"
  }, {
    "id" : "get-todo",
    "name" : "todo",
    "type" : "SAFE",
    "rt" : "#todo-representation"
  } ]
}

一些链接值得详细检查slides about ALPSRest Example。希望这对您的理解有所帮助。

关于java - 如何在微服务架构(HAL,ALPS)中正确设置Restful服务的文档,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37897058/

10-10 09:41