当前位置: 首页 > 知识库问答 >
问题:

HATEOAS在哈尔的帖子链接

洪承天
2023-03-14

我如何描述HAL中的帖子链接?

我正在设计一个带有HATEOAS约束的RESTful API,类似于Wikipedia的HATEOAS示例,但用HAL JSON表示(为了清晰起见,删除了scheme、host等):

GET /accounts/12345

{
  "id" : 12345,
  "balance" : 100.00
  "_links" : {
    "self" : {
      "href" : "/accounts/12345"
    },
    "transfer" : {
      "href" : "/accounts/12345/transfer{?amount,target}",
      "templated" : true
    }
  }
}

为了执行“转移”操作,客户大概会这样做:

GET /accounts/12345/transfer?amount=100.00,target=54321

{
  "id" : 34567,
  "amount" : 100.00
  "_links" : {
    "self" : {
      "href" : "/transfers/34567"
    },
    "source" : {
      "href" : "/account/12345"
    },
    "target" : {
      "href" : "/account/54321"
    }
  }
}

通过GET调用“transfer”链接会在“transfers”中创建一个新的ressource。但是创建一个新资源并不是幂等的,它“感觉”不对;以RESTful资源为中心的API将发布:

POST {amount: 10.00, source: 12345, target: 54321}  /transfers/

{
  "id" : 34567,
  "amount" : 100.00
  "_links" : {
    "self" : {
      "href" : "/transfers/34567"
    },
    "source" : {
      "href" : "/account/12345"
    },
    "target" : {
      "href" : "/account/54321"
    }
  }
}

但是我该如何描述这篇文章以及HAL中所需的html" target="_blank">表单元素,这样客户就可以在没有硬编码的情况下做“正确的事情”?也许是这样的:

{
  "id" : 12345,
  "balance" : 100.00
  "_links" : {
    "self" : {
      "href" : "/accounts/12345"
    },
    "transfer" : {
      "href" : "/transfers{?amount,source,target}",
      "templated" : true,
      "method" : "POST"
    }
  }
}

但是method不是HAL规范的一部分,也没有类似的标识符——所以感觉我走错了方向。。。

也许我的客户应该知道,一个GET的传输返回匹配的传输资源,一个POST到传输创建一个新的传输资源。

FWIW,我的实现使用Spring Boot 2和Spring HATEOAS,所以后续问题是如何用Spring HATEOAS表达这一点...

共有1个答案

颜乐
2023-03-14

你不能对哈尔这么做。哈尔的创始人迈克·凯利在GitHub上发表声明

这样做的HAL方法是使用链接rel留档以人类可读的形式传达可用的方法。也就是说,你的树皮例子看起来像这样(注意“树皮”链接rel现在是一个网址)

{
   "_links": {
        "http://docs.example.com/barks": { "href": "/v1/dogs/1/barks" }
    }
}

如果开发人员获取URLhttp://docs.example.com/barks在浏览器中,文档可以指定可用的方法、有效的请求主体、潜在的响应代码、响应主体等。然后开发人员将其编码到她正在构建的客户机中。

这是HAL规范imho的一个主要缺陷,但还有其他媒体类型可以解决这个问题,比如Mason或HAL扩展HAL-FORMS。也许值得一看,尽管我不确定它们是如何与Spring集成的。

 类似资料:
  • 我有一个名为AdminResource的父资源和一个名为AdminModuleResource的子资源。 父资源已正确安装HATEOAS链接: 子资源也正确安装了HATEOAS链接: 但是它的父资源已经失去了链接。 目前,在我的子管理模块资源中,父管理资源没有链接。事实上,汇编程序的toResources方法只提供子管理模块资源的链接。 你知道我如何在子管理模块资源中添加到父管理资源的链接吗? 编

  • 我正在使用sping-boot-2.2.1和sping-HATEOAS。超媒体链接工作正常,但是我在返回链接时看到了属性,请在这里找到下面的代码作为参考和github中的项目, 终点: a)将返回集合模型= 和 b) 将返回列表 控制器。Java 实际反应 预期反应: 我试过了 Spring数据RestdefaultMediaType=application/json spring.hateoas

  • 我在Wordpress上有一个旋转木马。我发现我不能在Chrome上点击任何项目链接,但当我使用Safari或Firefox时,它工作得很好。你可以看到我住在这里。我认为这是因为Safari/Firefox中旋转木马的辅助功能无法在项目之间拖动移动,但所有链接都可以工作。

  • 我发现了这个网站:http://www.jfletcherdesign.com. 我想复制一下主页上显示他所有帖子的特色图片的方式,以及当你点击你在特定帖子中深入查看的图片时显示的方式。我还想复制一下你是如何在一个类别中点击“前进”和“下一步”并将一个图像添加到相应的帖子中的。 有人能为我指出设置此功能的正确方向吗? 如果你能给我指出jQuery插件的话,我会得到额外的积分,该插件在他的分类页面上

  • 圈子帖子列表 圈子帖子详情 圈子帖子创建 圈子帖子更新 圈子帖子删除 我的帖子列表 全部帖子列表包含搜索 圈子帖子列表 GET /groups/:group/posts 响应 status 200 参数说明 名称 类型 说明 type string 默认:latest_post, latest_post 最新帖子,latest_reply最新回复 limit integer 默认 15 ,数据

  • 我正在使用Play框架调用一个web服务。功能是: } 我得到的错误是: 我不明白我做错了什么?有什么想法吗?