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

HATEOAS内容类型:自定义哑剧类型

孙文康
2023-03-14

我一直在尝试实现RESTFul体系结构,但我完全搞不清自定义媒体类型是好是坏。

目前,我的应用程序使用Http-Link:header传递“链接”。这很好,我将其与title属性一起使用,允许服务器描述这个“动作”到底是什么,尤其是当呈现给用户时。

我感到困惑的是是否应该指定自定义mime类型。例如,我有一个用户的概念。它可能与当前资源相关联。我要编一个例子,说我有一件拍卖品。我们可能有一个用户在“监视”它。因此,我将包括链接

<代码>

在标题中。如果您能够将该用户从监视中删除,您将获得。

<代码>

我对此很满意,如果客户有正确的角色,他可以解除关系。所以我在定义如何处理一段关系。最妙的是,如果我们在“关系”资源上调用GET,我将客户机重定向到用户资源。

让我困惑的是是否使用自定义mime类型。关于这一点,在互联网上和我的头脑中都有争论。

我做了一个示例,在这个示例中,我对未知url调用HEAD,服务器返回内容类型:application/vnd。我的应用程序。用户。然后,我的客户机决定它是否能够理解这个mime类型(它维护它所理解的资源到视图的映射),并将遵循它,或者解释它无法理解该链接末尾的内容。

这样不好吗?我必须保持特殊的哑剧类型。特别奇怪的是,我非常乐意使用标准的应用程序/用户格式,但是在任何地方都找不到指定的格式。

我开始认为我应该尝试完全猜测在任何HTTP响应中呈现什么,几乎到了我的RESTFul api应该只是呈现html,而不是尝试使用json/xml

我尝试过搜索(甚至是Roy Fieldings的博客),但是找不到任何描述客户应该如何处理这种情况的内容。

编辑:我对包含自定义类型的论点是,它可能不一定是一个“用户”在观看项目,它可能是带有application/vnd的东西。我的应用程序。组。通过得到响应,客户机知道主体具有不同的内容,因此更改为显示组的视图。但是,这种将mime类型与视图的耦合是否不好?。


共有2个答案

巫马星雨
2023-03-14

您不必发送超文本标记语言来服务超媒体。有许多不同的超媒体格式比超文本标记语言更容易解析。https://sookocheff.com/post/api/on-choosing-a-hypermedia-format/https://stackoverflow.com/a/13063069/607033

您不必使用特定于域的MIME类型,在我看来,最好将特定于域的词汇表与通用超媒体类型(例如微格式或模式)结合使用。带有JSON-LD Hydra或ATOM/XML微数据/RDFa等的组织。。。根据你的口味,有很多选择。https://en.wikipedia.org/wiki/Microdata_(HTML)http://microformats.org/ http://schema.org/ http://www.hydra-cg.com/

我不确定在多个方法中添加相同的关系是否是一个好的选择。如果需要,发送多个具有不同链接标题的链接:https://stackoverflow.com/a/25416118/607033

樊腾
2023-03-14

我想说的是,您肯定希望所有表示都有一个特定的媒体类型。如果您可以找到一个标准的(html、jpeg、atom等),请使用它,如果找不到,则应定义一个(或多个)。

原因是:表示应该是自包含的。这意味着你的客户从某个地方得到一个链接,它应该知道如何处理它。如何显示它,如何从那里开始,等等。例如,浏览器知道如何显示文本/html。您的客户机应该知道如何显示/处理应用程序/vnd。公司使用者

而且,我认为你的内容谈判是倒退的。您不需要调用HEAD来确定服务器支持什么表示。您可以使用“Accepts”头在GET/POST/etc请求中告诉服务器您的客户机支持什么。事实上,这将是做这件事的标准方式。然后,服务器会对您接受的mime类型给出“最佳”表示。你不需要更多的往返。

因此,尽管您提供的链接可以包含上下文信息,通常在“rel”属性中给出,比如链接指向“下一页”、“上一页”、“订阅用户”或“所有者用户”等,但客户端不能在这些链接下采用任何表示。它知道它在语义上是一个“用户”,因此它可以用用户(application/vnd.company.user)支持的所有表示形式填充“Accepts”头。如果表示只表示text/xml,那么客户机就无法假设它可能接收到的内容或链接的语义。

在实践中,您当然可以对任何客户端进行编码,以假设在什么链接/网址下有什么表示,并且您不必一直遵守REST,但是如果您这样做,您确实会得到很多好处(在罗伊·菲尔丁的论文中有所描述)。

另一个小点是:链接不需要包含给定资源的可用方法,这就是选项的用途。诚然,它很少得到实施。

 类似资料:
  • 我正试图通过WebClient发布以获取microsoft令牌: 问题在于,microsoft无法处理内容类型:application/x-www-form-urlencoded;charset=utf-8。 Spring会自动将charset=utf-8添加到请求中。我需要把这额外的字符集去掉。我需要一个内容类型:application/x-www-form-urlencoded。这可能吗?否则

  • Rust 自定义数据类型主要是通过下面这两个关键字来创建: struct: 定义一个结构体 enum: 定义一个枚举类型 而常量的创建可以通过 const 和 static 关键字来创建。

  • 存在多种方法来重新定义现有类型的行为以及提供新的类型。 重写类型编译 一个常见的需求是强制更改类型的“字符串”版本,即在create table语句或其他SQL函数(如cast)中呈现的版本。例如,应用程序可能希望强制呈现 BINARY 适用于除一个平台外的所有平台 BLOB 待渲染。在本例中,使用现有的泛型类型 LargeBinary ,是大多数用例的首选。但是为了更准确地控制类型,每个方言的编

  • 1. 包含头文件 #import <AdHubSDK/AdHubSDK.h> 2. AdHubCustomView 的创建和初始化 在需要导入广告的ViewController头文件中导入头文件并声明实例以及声明代理 #import <AdHubSDK/AdHubSDK.h> @interface AdHubCustomViewController ()<AdHubCustomViewDele

  • 如何在websphere自由服务器中添加Mime类型。我们对websphere自由服务器是新手。

  • 当检查在Microsoft 10的Edge浏览器中上传的文件Mime类型时,我得到了文件的Mime类型: 显然,这表明"任意二进制数据":我需要内容类型:应用程序/八位流文件下载? 在其他浏览器上,我得到 对于边缘浏览器的. doc文件,以及我需要注意的其他mime类型,是否有处理mime类型的新方法? 更新: 我使用php的