从服务器检索资源表示时,可能需要获取一些附加信息。我的意思是专门指资源的信息,例如一个特殊的错误消息(“请求的狗无法被检索,因为一只猫穿过马路!”)。
我做了一项研究,我对最RESTful 的方式感到有些困惑(不用说,我指的是 REST 的 HTTP 实现)。老实说,我觉得没有“标准”的方式可以采用,但我想听听不同的意见。
这是我的:
使用 HTTP Header - 这样做的主要原因是因为 HTTP 已经提供了一个信封,那么为什么要在协议的内部注入一个新的自定义信封呢?此外,HTTP 是一种应用程序协议,它应该支持应用程序交互。但是,将新信息推送到 Header 部分有两个缺点:首先,您将包含自定义内容,这不太符合“统一界面”建议。此外,通过查看标准标头,您会发现其中绝大多数都与连接和信息交换(Accept
、Connection
、Forwarded
、等)相关Host
,User-Agent
并以非常不可知的方式引用有效负载(Content-Type
、If-Match
、Etag
, ETC。)。对于特定于资源的信息,这似乎是不合适的上下文。
使用信封——这个策略有两个好处:它非常灵活,这是 99% 的客户习惯于查看元信息的地方。从理论上讲,我们可以说包含对象的信封是我们资源的表示。当被要求提供汽车对象时,服务器可以自由地为该请求提供最有意义的表示。不好的是,它听起来与完全反对 REST 的 SOAP 方法非常相似。
调解- 我的想法是务实的:不要滥用 Header 自定义并使用您拥有的自定义。如果您需要实现 HATEOAS,请使用Link
Header。如果您需要代表您的资源进行缓存,请使用ETag
. 如果您需要大量定制,请使用信封作为资源并在信封部分提供您需要的元信息。