是否有使用HATEOAS发现REST服务的策略?


10

在使用HATEOAS约束构建REST服务时,通过链接宣传存在的资源非常容易。您GET以我的网站的根目录为基础,然后我以列出所有第一层资源的根目录文档进行响应:

{
    users: { href: "/users" }
    questions { href: "/questions" }
}

了解如何读取这些href值的客户端可以对这些值执行GET请求,并发现应用程序中所有可用的当前资源。

这对于基本的查找方案非常有效,但不能指示资源是否可查询。例如,执行以下操作可能是合理的:

GET /users?surname=Smith

是否有任何格式可以用足够的信息来表达此查询功能,以使客户端无需事先了解资源就可以形成连贯的查询?

另外,有什么方法可以表示允许客户端POST对具有预期位置的给定位置执行操作。例如,可以期望客户执行以下操作来创建新的问题资源:

POST /questions

{
    title: "Are there strategies for discovering REST services using HATEOAS?",
    body: "When building a REST service with the HATEOAS constraint, it's very..."
}

当使用HTML作为人类消费的格式时,我们可以通过使用表格和书面提示来表达很多这种形式,以使人们能够发现他们被允许对服务执行的操作。

是否有能够为客户提供类似功能的格式?


2
关于REST服务的发现问题已在此处进行了讨论并得到了解答:stackoverflow.com/questions/9101494/…最简单的解决方案是将XHTML模板与一种形式一起使用,该模板不仅会告诉您可以使用的方法,而且还会告诉您通过表单元素(输入,选择等)发送的对象结构。客户端只需要具有XML解析器即可找到所需的内容。另一种方法是使用URL模板,但是它们只能帮助获取查询字符串的资源。
Spoike

关于内容类型;这可以通过在HTTP标头中完成的内容协商来解决。如果服务器无法提供请求的内容类型,则它应返回HTTP错误(例如300或406),指出它可以返回哪些内容类型。
Spoike

Answers:


1

您如何知道可以接受哪种输入?也就是说,如果您的客户没有先验知识,您将如何定义“姓”的语义?您开始进入需要OWL之类的领域

我认为期望您的客户了解众所周知的mime类型的语义更实际;例如为人们说“文本/ vcard”。


我认为使用内容类型是必经之路。我可以轻松地更改我的应用程序以使其使用application/atomapp+xml,并将其提供给所有已经了解该格式的客户端。可能有足够多的知名内容类型使之成为可行的解决方案。
Paul Turner

我认为@Spoike的评论是解决问题另一半的一种优雅的REST方法。即使客户端知道(例如)一个用户代表为vCard,它仍然需要知道用户属性的哪些子集可用于搜索。
Stephen J. Anderson

4

您可以通过“ WADL”发布有关服务的详细信息

http://en.wikipedia.org/wiki/Web_Application_Description_Language

它是可选的,并非每个后端REST技术都支持此功能。Jersey是jax-rs的“官方” java实现,例如支持它-它可以为您自动生成。

但是,看到它的使用却很少。

我不知道有大家伙在用它。通常,您有一个描述api的网页。


1
CXF是另一个支持WADL的大型Java JAX-RS实现,您现在也开始看到一些有趣的第三方WADL使用者。
Donal Fellows 2013年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.