运行API,如果我更正了内容类型标头,会为客户带来麻烦吗?


14

我们正在运行许多人使用的API。由于对我而言有些传统笨拙,一个端点被返回错误的内容类型标题js当它应该是json。我的问题是,如果我们通过交换以返回正确的值来解决此问题,那么它会对现有客户造成多大的麻烦?换一种说法,当看到这样的变化时,您是否期望许多不同的HTTP客户端库引发致命错误?

我们正在尝试确定这是否是一项更改,我们可以继续进行而又不费吹灰之力,或者我们应该仔细地向所有用户发送电子邮件,并宣布一个多年的弃用期……或介于两者之间。

这可能取决于使用哪种不同的HTTP客户端,所以我看了一下用户代理。答:很多不同!这里是一些顶级的:

“ okhttp / 3.2.0”,“ python-requests / 2.10.0”,“ Ruby”,“ python-requests / 2.7.0”,“ Mozilla / 5.0”,“ Java / 1.8.0_91”,“ python-requests” /2.4.3”、“okhttp/3.3.0”、“Lucee”、“Dalvik/2.1.0”、“Google-HTTP-Java-Client/1.21.0”、“PHP_appname”、“NativeHost”、“Java /1.7.0_67”、“Apache-HttpClient/UNAVAILABLE”、“Dalvik/1.6.0”、“Web-sniffer/1.1.0”、“unirest-objc/1.1”

各种不同的移动和服务器端语言库。通常不是运行javascript的浏览器,但也有一些。

大多数人似乎没有注意到content-type是错误的,但是不时出现一个新的支持请求,抱怨这个问题,因此我们想修复它。


4
我认为,一旦设置了正确的内容类型标头,可以正确工作的客户端将不会停止工作,但是您知道他们对假设的看法。因此,请进行测试,并提前将您的更改传达给用户群和/或内置一些其他逻辑,以便在某个客户端确实中断的情况下,您可以检测到该特定客户端并继续返回错误的内容类型标头(或者相反,返回对于那些生成支持票证并且对于当前用户/用户代理保持一切相同的客户而言,正确的解决方案)。
HBruijn

5
强制性xkcd:xkcd.com/1172
njzk2

您不对API进行版本控制吗?
迈克尔·汉普顿

我们只有整个API的主要版本号,在进行一些相当重大的重组后,我们只会在几年后看到它。到那时,我们当然会解决此问题,但是……感觉我们可能永远也不会这样做。这是那些版本号之一。
哈里·伍德

Answers:


30

它会给我们现有的客户带来多大的麻烦?

如果他们编写的代码依赖于此Content-Type不正确,则可能会完全击沉他们的战舰。

我不希望这些库引发错误,但是我希望在某些情况下,严格的库的行为已被改写以处理错误的MIME类型。

如果您的API在某处的请求字段中具有版本/修订值,请提高它,并在新版本中返回正确的类型,但在旧版本中继续返回错误的类型。如果您没有这样的请求字段,那么现在是添加一个请求字段的好时机。


6
为好夸张已+1
HBruijn

4
通常,您别无选择。给出“更新或离开”最后通atum的客户可以选择后者,原则上是好的,而实践上是不好的。旧版本可以逐步淘汰。
alzee '16

3
+1 vor对请求进行版本控制,尽管您可能想查看en.wikipedia.org/wiki/Software_versioning以获取更多信息。
SBoss,

7
@WinstonEwert:当然值得。人们指定他们要使用的API版本,那么在您更新API和更新程序之间的时间里,他们的程序不会自发燃烧。如果不这样做,则在更改界面时会自动中断客户代码的每个当前版本和历史版本。这是运行服务的可怕方式。
与莫妮卡(Monica)进行的轻度比赛

1
这似乎是一个很好的观点:“我希望在某些情况下,严格的库的行为已被改写以处理错误的mime类型。”我的直觉(作为对整个问题的回答)是绝大多数客户库将对此很好,但这是一个问题。一些客户可能会主动解决此问题,然后进行交换会为他们带来麻烦。我想知道发生了多少事情。
哈里·伍德

11

看到这样的变化时,您会期望许多不同的HTTP客户端库引发致命错误吗?

不会。我熟悉的每个HTTP客户端库都将忽略内容类型标头,除非程序员专门读取了该标头并对其进行了处理。我可以想象一个库,其中的内容类型:application / json会自动导致json解析器参与其中,但是我不知道实际发生的任何情况。

大多数人似乎没有注意到content-type是错误的,但是不时出现一个新的支持请求,抱怨这个问题,因此我们想修复它。

他们如何注意到错误的标题?可能值得一看,因为如果错误的标头实际上导致了他们的问题,那么他们显然不仅会忽略它,而且如果它已修复,他们可能会遇到问题。



如果您使用jQuery $.ajax而不指定dataType:选项,它将从Content-type标题中推断响应类型。因此,如果是application/json,它将在传递给调用者之前自动解析它。
巴马尔

6

没有得到所有客户的批准,很难说出来。我建议采用以下两种方法之一将您的API升级到v.Next。

  1. 扩展现有的API。向您的API添加一个查询字符串或其他一些变量,以表示使用v.Next。对于使用该变量的所有请求,请使用更新的内容类型。
  2. 与您当前的API并行运行您的API的Staging或Pre-Production实例。它应该与生产几乎相同。即使使用相同的后端。尽管此版本将具有v.Next的建议更改。

在任何一种情况下,请与您的客户交流您要进行的更改以及目标转换日期/时间。鼓励他们在目标日期之前进行良好的测试,以确保不会中断服务。

确保您有专门的页面,详细说明了对v.Next所做的更改。这应该包括在发送给您的客户的通信中。如果您已与现有客户端讨论了任何修复程序,请在此页面上进行修复。

最后,要在与客户过度沟通与向客户发送垃圾邮件之间加分。随着更多紧急/紧急优先事项的出现,这些通知很容易被忽略。

FWIW,如果目前一切正常,我不会对此太担心。例如,如果您发现这会导致严重的安全漏洞,那么这就是推行此更改的重要原因。否则,我将等待更多的压力来包含此更改。


谢谢。这不是我想听到的答案,但也许您是对的。我们只需要非常谨慎地介绍更改。难道是“太难说”了吗?我想我希望有些人能体会到这种特定类型的内容类型标头更改的可能影响(谨慎地保留了有关版本控制的更为通用的观点)
哈里·伍德

5

这是一个可能会中断的库示例(很好,单个命令):

cmdlet的Invoke-RestMethod使用JSON的作用是不同的。如果请求的结果是JSON,XML或ATOM / RSS(并且我认为它基于标头),则它将解析/反序列化它并返回本机对象,否则返回原始数据。

因此,现有的代码将被编写为处理字符串(也许通过将其传递给ConvertFrom-Json),并且突然开始失败。



-2

我注意到了两个后果:

  1. 某些客户端库将无法正确处理响应。例如,响应返回一个字符串,而不是json或数组。
  2. 压缩并不总是适用。

肯定是发送数据的人而不是接收数据的人采用了压缩吗?
TRiG
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.