自定义HTTP标头:命名约定

关于自定义HTTP标头的命名,普遍做法是在名称前加'X-'前缀,以表明其非标准性质。然而,RFC 6648不再推荐使用'X-',建议直接使用有意义的命名,除非头极不可能被标准化。在私有API上下文中,使用'X-ACME-'等形式可以避免冲突。同时,HTTP头的格式应遵循ASCII字符子集,而头值可以包含八位字节。
摘要由CSDN通过智能技术生成

我们的一些用户要求我们在我们发送请求的HTTP标头中包含与其帐户相关的数据,甚至是我们从API获得的响应。 在命名格式化等方面添加自定义HTTP标头的一般惯例是什么?

另外,您可以随意发布您在网上偶然发现的任何智能用途; 我们正试图用最好的目标来实现这个目标:)


#1楼

这个问题需要重新阅读。 所提出的实际问题与CSS属性中的供应商前缀不同,后者在未来的情况下以及对供应商支持和官方标准的考虑是合适的。 问的实际问题更类似于选择URL查询参数名称。 没有人应该关心它们是什么。 但是,自定义名称间隔是完全有效的 - 并且是常见且正确的 - 要做的事情。

理由:
它是关于开发人员之间关于定制,特定于应用程序的标题 - “ 与其帐户相关的数据 ” - 与供应商,标准组织或由第三方实施的协议无关的约定 ,除了有问题的开发人员只需要避免服务器,代理或客户端可能具有其他预期用途的标头名称。 出于这个原因,给出的“X-Gzip / Gzip”和“X-Forwarded-For / Forwarded-For”示例没有实际意义。 提出的问题是关于私有API上下文中的约定,类似于URL查询参数命名约定。 这是一个偏好和名称间距的问题; 没有“X”的任何代理或供应商支持“X-ClientDataFoo”的担忧显然是错误的。

关于“X-”前缀没有什么特别或神奇之处,但它有助于明确它是一个自定义标题。 实际上,RFC-6648等帮助支持使用“X-”前缀的情况,因为 - 当HTTP客户端和服务器的供应商放弃前缀 - 您的应用程序特定的私有API,个人数据 - 传递机制变得更加绝对 - 与少量官方保留标题名称的名称空间冲突隔离。 也就是说,我的个人偏好和建议是更进一步,例如“X-ACME-ClientDataFoo”(如果您的小部件公司是“ACME”)。

恕我直言,IETF规范没有足够具体来回答OP的问题,因为它无法区分完全不同的用例:(A)供应商一方面引入新的全球适用功能,如“Forwarded-For”,与(B) app开发人员将特定于应用程序的字符串传递给客户端和服务器。 该规范仅涉及前者(A)。 这里的问题是(B)是否有惯例。 有。 它们涉及按字母顺序将参数分组,并将它们与(A)类型的许多标准相关标题分开。 使用“X-”或“X-ACME-”前缀对于(B)来说是方便和合法的,并且与(A)不冲突。 对于(A),越多的供应商停止使用“X-”,(B)将变得越清晰。

例:
谷歌(在各种标准机构中占有一定的份量)是 - 截至今日,20141102,在我的回答的这个轻微编辑中 - 目前正在使用“X-Mod-Pagespeed”来表示其所涉及的Apache模块的版本转换给定的响应。 是否有人真的建议谷歌应该使用“Mod-Pagespeed”而不使用“X-”,和/或要求IETF保佑其使用?

摘要:
如果您在应用程序中使用自定义HTTP标头(作为有时适合的cookie替代方案)来向服务器传送数据或从服务器传递数据,并且这些标头明确地不打算在应用程序的上下文之外使用,使用“X-”或“X-FOO-”前缀对它们进行名称间隔是一种合理且通用的约定。


#2楼

2012年6月,对使用“X-”前缀的建议的弃用已成为RFC 6648的正式版本。 以下是相关的引用:

3.对新参数的创建者的建议

...

  1. 不应该在其参数名称前加上“X-”或类似的结构。

4.对协议设计者的建议

...

  1. 不应禁止注册具有“X-”前缀或类似结构的参数。

  2. 绝不能规定具有“X-”前缀或类似结构的参数需要被理解为非标准化。

  3. 绝不能规定没有“X-”前缀或类似结构的参数需要被理解为标准化。

请注意,“不应该”(“不鼓励”)与“必须”(“禁止”)不同,请参阅RFC 2119以获取有关这些关键字的其他规范。 换句话说,您可以继续使用“X-”前缀标题,但不建议这样做,您也不能将它们记录为公共标准。


2011年6月,发布了第一个IETF草案弃用了对非标准头文件使用“X-”前缀的建议。 原因是当前缀为“X-”的非标准头文件成为标准时,删除“X-”前缀会破坏向后兼容性,迫使应用程序协议支持这两个名称(例如, x-gzipgzip现在是等效的)。 所以,建议只是在没有“X-”前缀的情况下明智地命名它们。


建议 与“X-”开始他们的名字。 例如X-Forwarded-ForX-Requested-With 。 这也在RFC 2047的第5节中提到。


#3楼

头字段名称注册表在RFC3864中定义,并且“X-”没有什么特别之处。

据我所知,私有标题没有指导原则; 有疑问,避免它们。 或者查看HTTP扩展框架( RFC 2774 )。

了解更多用例会很有趣; 为什么不能将信息添加到邮件正文中?


#4楼

HTTP标头的格式在HTTP规范中定义。 我将讨论HTTP 1.1,其规范是RFC 2616 。 在第4.2节“消息头”中,定义了头的一般结构:

   message-header = field-name ":" [ field-value ]
   field-name     = token
   field-value    = *( field-content | LWS )
   field-content  = <the OCTETs making up the field-value
                    and consisting of either *TEXT or combinations
                    of token, separators, and quoted-string>

该定义基于两个主要支柱:令牌和TEXT。 两者都在第2.2节“基本规则”中定义。 令牌是:

   token          = 1*<any CHAR except CTLs or separators>

反过来依靠CHAR,CTL和分隔符:

   CHAR           = <any US-ASCII character (octets 0 - 127)>

   CTL            = <any US-ASCII control character
                    (octets 0 - 31) and DEL (127)>

   separators     = "(" | ")" | "<" | ">" | "@"
                  | "," | ";" | ":" | "\" | <">
                  | "/" | "[" | "]" | "?" | "="
                  | "{" | "}" | SP | HT

文字是:

   TEXT           = <any OCTET except CTLs,
                    but including LWS>

LWS是线性空白区域,其定义我不会重现,而OCTET是:

   OCTET          = <any 8-bit sequence of data>

该定义附有说明:

The TEXT rule is only used for descriptive field contents and values
that are not intended to be interpreted by the message parser. Words
of *TEXT MAY contain characters from character sets other than ISO-
8859-1 [22] only when encoded according to the rules of RFC 2047
[14].

那么,有两个结论。 首先,很明显,标题名称必须由ASCII字符的子集组成 - 字母数字,一些标点符号,而不是其他许多字符串。 其次,标题的定义中没有任何内容将其限制为ASCII或排除8位字符:它明确地由八位字节组成,仅禁止控制字符(注意CR和LF被视为控件)。 此外,对TEXT产生的评论暗示八位字节将被解释为在ISO-8859-1中,并且存在用于表示该编码之外的字符的编码机制(这是偶然的,可怕的)。

因此,特别要回应@BalusC,很明显根据规范,标题值在ISO-8859-1中。 我已经在Tomcat的标题中发送了高8859-1个字符(特别是法语中使用的一些重音元音),并且让它们被Firefox正确解释,所以在某种程度上,这在实践和理论上都有效。 (虽然这是一个包含URL的Location标头,这些字符在URL中不合法,所以这实际上是非法的,但是在不同的规则下!)。

也就是说,我不会依赖ISO-8859-1在所有服务器,代理和客户端上工作,所以我会坚持使用ASCII作为防御性编程的问题。


#5楼

RFC6648建议您假设您的自定义标头“可能在多个实现中变得标准化,公共,通常部署或可用”。 因此,建议不要在其前面添加“X-”或类似结构。

但是,有一个例外“当你的标题极不可能被标准化时。” 对于这种“特定于实现和私有”的头,RFC表示诸如供应商前缀之类的命名空间是合理的。


#6楼

修改或更正确地添加额外的HTTP头是一个很好的代码调试工具,如果没有别的。

当URL请求返回重定向或图像时,没有html“页面”暂时将调试代码的结果写入 - 至少不是浏览器中可见的。

一种方法是将数据写入本地日志文件并稍后查看该文件。 另一种方法是临时添加反映正在调试的数据和变量的HTTP头。

我经常添加额外的HTTP标头,如X-fubar-somevar:或X-testing-someresult:测试出来的东西 - 并且发现了许多本来很难追查的错误。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值