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
我如何使用供应商特定的MIME-TYPE来表示“a”;“私人”标签;RESTAPI_Api_Rest_Mime Types_Content Type_White Labelling - Fatal编程技术网

我如何使用供应商特定的MIME-TYPE来表示“a”;“私人”标签;RESTAPI

我如何使用供应商特定的MIME-TYPE来表示“a”;“私人”标签;RESTAPI,api,rest,mime-types,content-type,white-labelling,Api,Rest,Mime Types,Content Type,White Labelling,我正在开发一个RESTful API。目前,我正在考虑使用特定于资源的供应商MIME类型来传达语义和含义,以及作为客户机和服务器之间的“契约” 因此,例如application/vnd.mycompany.person+xml意味着所讨论的数据是代表个人的xml 我有一个要求,使这个API“私人标签”,这意味着经销商可以反过来提供API给他的客户,而他的客户不知道这是我公司的服务。这样做的方式是,我的公司将主api托管在一种通用url上,即www.example.com/api,然后我的公司将使

我正在开发一个RESTful API。目前,我正在考虑使用特定于资源的供应商MIME类型来传达语义和含义,以及作为客户机和服务器之间的“契约”

因此,例如application/vnd.mycompany.person+xml意味着所讨论的数据是代表个人的xml

我有一个要求,使这个API“私人标签”,这意味着经销商可以反过来提供API给他的客户,而他的客户不知道这是我公司的服务。这样做的方式是,我的公司将主api托管在一种通用url上,即www.example.com/api,然后我的公司将使用CNAME将我们的域名指向该url,我们的经销商也可以这样做

在内部,所有的资源链接都是相对于API根的,因此会尊重正在使用的实际url

但是,我不想必须理解/支持任意特定于供应商的MIME类型,那么上面示例MIME类型的“mycompany”部分应该是什么呢?

HTTP规范:

不鼓励使用未注册的媒体类型

我以前在我的平台中使用“自定义”媒体类型,但这会导致用户代理(浏览器、cURL、wget等)无法识别内容

您可以尝试注册自定义媒体类型,但(A)这需要一段时间;(B) 如果可能的话,用户代理需要很长时间才能识别出该类型;(C) 您已表示不希望公司名称始终存在

作为“自定义”媒体类型的替代方法,我建议使用媒体类型参数;它们是向媒体类型添加内容补充信息的好方法


使用参数,您的媒体类型可以是
application/xml;mycompanyschema=person
或者可能只是
应用程序/xml;schema=person

我已经看到了一些框架和教程,它们推荐特定于供应商的mime类型来“解决”使您的REST接口“真正RESTful”的问题,仅仅是因为它可以完成,并且以某种方式使REST服务更干净

这种方法的一个问题是,从本质上讲,它是一种黑客或欺骗,目的是“让它以您想要的方式工作”,而转向超媒体驱动的REST服务的全部目的是改变API和服务的模型,并改变您处理问题的方式。为
内容类型潜入一个“有效”或允许但不推荐的HTTP值
,就像告诉饥饿的委内瑞拉人老鼠是鱼,这样他们就可以在四旬斋期间毫无罪恶地吃掉它们。如果你只吃老鼠,那吃老鼠有什么不对吗?可能不会。但是假装它是鱼会让它变成鱼吗?当然不是。如果您需要契约驱动的接口,请使用RPC或SOAP,甚至可以使用自定义的供应商mime类型。但是不要指着说明书说它是休息,因为最终你吃了一只老鼠,每个人都知道,你只是在欺骗自己

第二个问题是,当你走捷径时,你正在失去超媒体驱动界面的实际回报。您马上就遇到了用户代理和您自己的服务器的问题,因为mime类型不熟悉,您不得不跳转或干脆放弃。所有这些都是因为你认为你可以两全其美,当重点不是用真正的Rest服务来打动你的客户,或者通过减少契约驱动交互的额外重量(在某些情况下显然是有价值的)来减轻一点负担时,那就是改变你的服务实际与外部客户交互的方式

最后,我真的不清楚特定于供应商的mime类型实际上如何比定义的端点更好地执行契约?所有提到这项技术的网站似乎都对这个选项的存在感到欣慰,而且,坦率地说,他们对使用它感到有点沾沾自喜和高兴,好像他们知道这在技术上是“淘气”的,但它很简单,可以修复一切。它能修复什么?在您的情况下,为什么不让您的入站
人员
请求/内容转到:

POST /myRestService/people
如果他们有其他请求,是否会转到其他数据类型的端点?如果你需要一种方法来做某事,你会选择:

GET /myRestService/people/personID_123/does_something 

取决于确切的上下文

因此,我听起来并不是说除了疯子之外,任何挫折或愤怒都不是针对你或你的问题,而是针对供应商mime类型的“解决方案”,以及每个人对“罗伊·菲尔丁正式批准并盖章”的迷恋
作为有效的REST服务,“显然没有人能够提供一个有效的公共示例,只留下一种立即采用它的紧迫感,采取任何需要的快捷方式,我们可以在以后实际解决快捷方式造成的问题时处理羞耻和指责。

感谢您的回复。我必须研究使用参数。可以将它们用作链接的“type”属性吗。例如:
表示如果您将遵循person-v1模式的xml发布到某个URL,它将起到一定作用。@bhazzard,是的,我想是这样。您还可以使用自定义HTTP头。参见HTTP规范,Roy Fielding说了一件事,并引用另一件事:“REST API应该花费几乎所有的描述性工作来定义用于表示资源和驱动应用程序状态的媒体类型(…)描述在感兴趣的URI上使用什么方法的任何工作都应该完全在媒体类型的处理规则范围内定义(在大多数情况下,已经由现有媒体类型定义)。”from:另一个选项,用于让客户端知道如何处理与特定于应用程序的RDF描述、使用和RDF感知MIME类型相关的数据。例如,通过JSON,它可以
GET /myRestService/people/does_something/personID_123