Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Api REST-HATEOAS:如何知道发布什么?_Api_Rest_Post_Hateoas - Fatal编程技术网

Api REST-HATEOAS:如何知道发布什么?

Api REST-HATEOAS:如何知道发布什么?,api,rest,post,hateoas,Api,Rest,Post,Hateoas,我仍然不明白客户端在创建资源时如何知道要发布哪些数据。大多数教程/文章都忽略了这一点,在它们的示例中,客户似乎总是事先知道要发布什么(即使用带外信息)。例如,消费者知道他必须通过设置他想要的东西来下订单 我只能想象一些方法,我不知道它们是否有效: 1。返回空资源 客户机发现一个指向/resource/create的链接和一个关系“create”的/resource链接。GET to/resource/create返回一个空资源(所有属性都为空)和一个指向/resource/create的链接,该

我仍然不明白客户端在创建资源时如何知道要发布哪些数据。大多数教程/文章都忽略了这一点,在它们的示例中,客户似乎总是事先知道要发布什么(即使用带外信息)。例如,消费者知道他必须通过设置他想要的东西来下订单

我只能想象一些方法,我不知道它们是否有效:

1。返回空资源
客户机发现一个指向/resource/create的链接和一个关系“create”的/resource链接。GET to/resource/create返回一个空资源(所有属性都为空)和一个指向/resource/create的链接,该链接的关系为“post”。然后,客户端为所有属性设置值,并将其发布到/resource/create,后者返回201(已创建)。这意味着CRUD操作不位于资源端点,而是位于URI(如/resource/create),客户端可能会设置服务器忽略的属性(如在服务器端设置的创建日期)

2。返回表单
基本上与上述方法相同,尽管返回的不是资源,而是关于要发布哪些字段以及每个属性需要具有哪些数据类型的一些元信息。例如。但是,创建端点不位于/resource,而是位于/resource/create上

3。通过更新创建
“发布到/资源”会立即创建一个空资源并返回指向该资源的链接。然后,客户机可以按照此链接使用必要的数据更新资源

那么,仍然遵循HATEOAs范式的最佳方法是什么?为什么所有这些教程(甚至像REST这样的书都在实践中)都忽略了这个问题



更新:

我最近发现它似乎非常接近“理想”的REST HATEOAS API。它不仅定义了一些资源并在它们之间进行超链接,还定义了媒体类型和版本控制。通过所有这些理论讨论,有一个具体的exmaple是非常好的。也许这有助于一些读者了解这个问题。

大多数关于REST的教程和书籍都具有误导性,因为人们对REST有很多误解,除了菲尔丁的论文本身,没有权威来源,这是不完整的

休息不是积垢。
POST
不是
CREATE
的同义词
POST
是用于任何尚未被HTTP标准化的操作的方法。如果它没有被HTTP标准化,那么它的语义是由目标资源本身决定的,并且确切的行为必须由资源媒体类型记录下来

使用HATEOAS,客户不应依赖带外信息来驱动交互。文档应该关注媒体类型,而不是URI和方法。人们很少能做到这一点,因为他们没有正确地使用媒体类型,而是记录URI端点


例如,在您的示例中,所有内容都具有
application/xml
media类型。这就是问题所在。如果没有合适的媒体类型,当所有内容都具有相同的媒体类型而不依赖URI语义时,就无法记录特定于资源的语义,这将破坏HATEOAS。相反,饮料应该有一个媒体类型,如
application/vnd.mycompany.drink.v1+xml
,并且您的媒体类型API文档可以描述使用带有rel链接的POST时的预期效果。

谢谢您的回复。如果我有一个媒体类型的应用程序/vnd.mycompany.drink.v1+xml,客户端就必须事先知道媒体类型,不是吗?与描述资源及其属性的常规文档有什么区别?媒体类型信息存储在哪里?客户端必须事先知道媒体类型。除了入口点URI之外,这是客户端应该拥有的唯一带外信息。区别在于它关注的是媒体类型,而不是URI语义。媒体类型信息在您的文档中,无论您在哪里。好的,谢谢。所以,如果我在这个博客()中定义我的媒体类型,可以吗?像第二步那样定义uri自动意味着向collection uri发布一个项目结构会导致将该项目添加到集合中?我定义媒体类型的格式是否自由?如果是这样,我不明白为什么从技术角度定义自定义媒体类型是必要的(例如,在Spring控制器中的@RequestMapping中使用它们),这看起来不错。POST永远不会自动意味着什么。如果你使用POST,你必须记录它的功能。使用通用媒体类型的API从来都不是RESTful的。我只是被以下事实弄糊涂了:在博客中,这个家伙除了这样说之外,没有定义POST做了什么。如果这足够好,好吧:-)但是,如果我必须在代码之外记录结构/媒体类型,为什么我不应该在任何地方使用application/json呢?