从REST API获取接受的标头

从REST API获取接受的标头,rest,Rest,例如,在RESTAPI的上下文中,Allow字段用于获取: 指定资源的有效操作 例如: Allow: GET, HEAD 是否也有一个众所周知的字段,以便获得接受头的列表?例如: Accept: application/vnd.company.api.com.foo+json;v=42, application/vnd.company.api.com.foo+xml;v=42 由客户机告诉服务它可以接受什么,因为如果它不能接受响应,客户机不能做很多事情(因为它不知道如何处理返回的媒体类型)

例如,在RESTAPI的上下文中,
Allow
字段用于获取: 指定资源的有效操作

例如:

Allow: GET, HEAD
是否也有一个众所周知的字段,以便获得接受头的列表?例如:

Accept: application/vnd.company.api.com.foo+json;v=42, application/vnd.company.api.com.foo+xml;v=42

由客户机告诉服务它可以接受什么,因为如果它不能接受响应,客户机不能做很多事情(因为它不知道如何处理返回的媒体类型)

如果服务器无法创建符合的资源表示,则可以执行以下两项操作之一:

  • 发送406不可接受
  • 发送不符合Accept标头(HTTP 1.1)的响应
如果服务器发送406,根据,只要不是HEAD请求,“响应应包括一个实体,其中包含可用实体特征和位置列表,用户或用户代理可以从中选择最合适的实体。实体格式由Content type header字段中给定的媒体类型指定。”

用简单的英语来说,这意味着回复应该附有它可以提供的内容的链接。可以通过将配置文件属性附加到包含的链接来传送媒体类型(尽管这因媒体类型而异)

了解服务器提供何种媒体类型的一种方法是通过根URI提供的链接菜单(使用众所周知的媒体类型)来发现它们。例如,您对
/
的请求可能会指定一个接受头
text/html
,并收到以下响应:

<html>
  <head>
    <link rel="foo" type="application/vnd.company.api.com.foo+json;v=42" href="http://v42.api.com/foos/3713678123" />
    <link rel="foo" type="application/vnd.company.api.com.foo+json;v=43" href="http://v43.api.com/foos/3713678123" />
  </head>
</html>

由客户机来告诉服务它可以接受什么,因为如果客户机不能接受响应,它就不能做很多事情(因为它不知道如何处理返回的媒体类型)

如果服务器无法创建符合的资源表示,则可以执行以下两项操作之一:

  • 发送406不可接受
  • 发送不符合Accept标头(HTTP 1.1)的响应
如果服务器发送406,根据,只要不是HEAD请求,“响应应包括一个实体,其中包含可用实体特征和位置列表,用户或用户代理可以从中选择最合适的实体。实体格式由Content type header字段中给定的媒体类型指定。”

用简单的英语来说,这意味着回复应该附有它可以提供的内容的链接。可以通过将配置文件属性附加到包含的链接来传送媒体类型(尽管这因媒体类型而异)

了解服务器提供何种媒体类型的一种方法是通过根URI提供的链接菜单(使用众所周知的媒体类型)来发现它们。例如,您对
/
的请求可能会指定一个接受头
text/html
,并收到以下响应:

<html>
  <head>
    <link rel="foo" type="application/vnd.company.api.com.foo+json;v=42" href="http://v42.api.com/foos/3713678123" />
    <link rel="foo" type="application/vnd.company.api.com.foo+json;v=43" href="http://v43.api.com/foos/3713678123" />
  </head>
</html>


您真的需要自动发现此信息吗?通常,受支持的媒体类型是带外信息,在您的情况下(因为您使用的可能是未注册的媒体类型),它肯定是带外信息。我同意,因为在给定的示例中,
foo
不是超媒体类型。但是,自动发现此信息的能力可能对长期有用,API(无任何版本)可能首先使用HAL,然后在2年后切换到Siren。。。我认为,如果在API的整个生命周期中都使用特定的超媒体语言,那么太多的反管道操作将是危险和困难的。明天又是新的一天。通过使用根菜单选项作为播发其支持的媒体类型的位置,服务器不仅可以播发其支持的媒体类型,还可以在更细粒度的级别上进行播发(因为您可以根据链接的资源改变支持的媒体类型)。您真的需要自动发现此信息吗?通常,受支持的媒体类型是带外信息,在您的情况下(因为您使用的可能是未注册的媒体类型),它肯定是带外信息。我同意,因为在给定的示例中,
foo
不是超媒体类型。但是,自动发现此信息的能力可能对长期有用,API(无任何版本)可能首先使用HAL,然后在2年后切换到Siren。。。我认为,如果在API的整个生命周期中都使用特定的超媒体语言,那么太多的反管道操作将是危险和困难的。明天又是新的一天。通过使用根菜单选项作为播发其支持的媒体类型的位置,服务器不仅可以播发其支持的媒体类型,还可以在更细粒度的级别上进行播发(因为您可以根据链接的资源改变支持的媒体类型)。