暂时:抱歉,如果我误解了超媒体或Restfull概念:这项工作仍在进行中...)

我尝试找出超媒体和hydra(http://www.markus-lanthaler.com/hydra),并在设计api之前对将信息返回给客户端有一些疑问。

说我在www.myshop.com上有一个网上商店

到根的HTTP GET可以返回(例如)表示为链接的资源列表(在json-ld文档中):

...
"@id": "/api",
"products" : "www.myshop.com/api/products",
"customers":"www.myshop.com/api/customers"
...

关于hydra的第一个问题,如何在此处添加操作?看来客户端需要在加载应用程序之前先加载另一个文档。我的意思是潜在的动作不在从www.myshop.com/api检索的文档中,还是我错过了什么?

然后,我进一步说,产品是hydra:Link,以便客户端可以使用HTTP GET跟踪该链接(与之交互)并检索产品列表。那将是这样的列表:
....
{
  "@id": "/api/products/123",
  "@type": "vocab:Product"
},
{
  "@id": "/api/products/124",
  "@type": "vocab:Product"
},
....

客户在这里收到产品列表(可能是分页集合)。但是,如果客户希望将其显示给用户,则可以使用 [产品ID,价格,名称] (并非所有产品属性)的表格

第二个问题:如果客户不向服务器发送每种产品的请求,但仍然提供获取产品详细信息的链接,我该怎么办呢?一个用于删除,另一个用于与朋友共享,最后一个用于将其添加到购物篮)?

实际上,我很难通过在文档本身中没有链接来弄清楚九头蛇是如何发挥作用的?我认为Hal使用这种方法在文档本身中具有链接(如果我是对的话),我试图找出hydra如何实现此链接...

问候

最佳答案

有点晚了,不过我还是会尝试回答您的问题Cedric。

说我在www.myshop.com上有一个网上商店

到根的HTTP GET可以返回(例如)资源列表
表示为链接(在json-ld文档中):

 ... "@id": "/api",
 "products" : "www.myshop.com/api/products",
 "customers":"www.myshop.com/api/customers" ...

关于hydra的第一个问题,如何在此处添加操作?看来
客户需要在加载应用程序之前加载另一个文档。
我的意思是潜在的动作不在从中检索的文档中
www.myshop.com/api还是我想念什么?

您基本上在这里有两个选择:1)将操作直接嵌入到响应中,或者2)而是将操作附加到属性(productscustomers)。

方法1)看起来像这样:
...
"@id": "/api",
"products" : {
  "@id": "http://www.myshop.com/api/products",
  "operation": {
    "@type": "Operation",
    "method": "POST",
    "expects": "Product"
  }
}
...

虽然方法2)将相同的操作附加到所引用的Hydra ApiDocumentation中的products属性:
...
"@id": "...products",
"supportedOperation": {
  "@type": "Operation",
  "method": "POST",
  "expects": "Product"
}
...

请注意,在1)中我使用了operation而在2)中我使用了supportedOperation。另外,您应该使用比Operation更具体的类型。

关于第二个问题:

使用HTTP GET并检索产品列表。那将是这样的列表:
....
{
  "@id": "/api/products/123",
  "@type": "vocab:Product"
},
{
  "@id": "/api/products/124",
  "@type": "vocab:Product"
},
....

客户在这里收到产品列表(可以是
采集)。但是,如果客户希望将其显示给用户,让我们
用[产品ID,价格,名称]说一个表格(不是所有产品的
属性)

第二个问题:如果没有客户端发送
向服务器请求每个产品,但仍提供指向
获取产品的详细信息,(甚至在这里有四个链接
:一种用于获取详细信息,一种用于删除,另一种用于
与朋友分享,最后一个分享给购物篮)?

您可以直接在集合中添加任意数量的信息(包括链接)。
....
{
  "@id": "/api/products/123",
  "@type": "vocab:Product",
  "name": "Product 123",
  "price": "9.99"
},
{
  "@id": "/api/products/124",
  "@type": "vocab:Product",
  "name": "Product 124",
  "price": "19.99"
},
....

这样,如果集合不包含必需的信息,则客户端仅需要取消引用项目。

实际上,我很难弄清楚水合如何进入
玩没有文档本身的链接?

当然,您在文档中也确实具有链接。链接只是其值恰好是URL的属性(具有@id属性的对象,除非您在上下文中将该属性的类型设置为@id来消除该链接),而不是对其进行特殊处理。

关于rest - Json-LD中的主从细节表示,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25351401/

10-10 10:32