关于使用 HTTP 请求头在网站 (HTML) 和 api (JSON) 之间切换的意见

Posted

技术标签:

【中文标题】关于使用 HTTP 请求头在网站 (HTML) 和 api (JSON) 之间切换的意见【英文标题】:Opinions on using HTTP request headers to switch between website (HTML) and api (JSON) 【发布时间】:2012-01-05 20:06:54 【问题描述】:

我们有一个电子商务网站,它按类别显示产品组,使用的 URL 格式几乎完全映射到我们希望用于即将推出的 API 的 REST URL 格式。

例如example.com/products/latestexample.com/products/hats

对可见 (html) 和不可见 (JSON) 结果使用相同的 URL 并使用 Accept http 请求标头来确定应返回的内容是否有效。

即如果您使用 Accept: application/json 调用 example.com/products/latest,您将只获得产品数据,但如果您使用 text/html,您将获得完整的 HTML 页面(页眉、页脚、网站 chrome 等)

如果是这样,这是个好主意吗?例如,如果网站需要更改,但 API 需要稳定,我们会遇到问题吗?

更新:一些有用的资源 - 这是 Peter Williams 的一篇文章 [1],讨论了将 HTTP Accept 标头用于版本 API,我还引用了一个 SO 问题 [2]揭示了使用这种方法的一些问题。使用自定义 HTTP 标头可能更好?

[1] 提出使用接受的理由:http://barelyenough.org/blog/2008/05/versioning-rest-web-services/ [2] jQuery (& IE) 的问题:Cannot properly set the Accept HTTP header with jQuery [3] 使用Accept的理由:http://blog.steveklabnik.com/2011/07/03/nobody-understands-rest-or-http.html [4] 围观:http://www.informit.com/articles/article.aspx?p=1566460

【问题讨论】:

【参考方案1】:

我没有这方面的经验,但 Restful Web Services 建议您通过 URL(例如 api.example.com/v1/products/hats)对 API 进行版本控制——我不确定这适合为网站和 API 使用相同的 URL。

【讨论】:

是的 - 如果通过 URL 完成版本控制会导致问题。我以前见过用标题完成版本控制,但找不到参考(并且不确定这是最好的方法。) @HugoRodger-Brown:当然,我想你可以让你的 API 需要一个包含版本的自定义 HTTP 标头。 (假设您想确保人们明确调用 API 的给定版本——如果不是,那么显然所有这些都是无关紧要的。)【参考方案2】:

使用 http 标头通常已成为确定这一点的公认方法。

例如,在 ASP.NET MVC 中,有一个 IsAjaxRequest 方法检查 X-Requested-With 标头,如果它等于 "XMLHttpRequest",则认为它是一个 ajax 请求。

【讨论】:

【参考方案3】:

上次我尝试这样做(这是几年前)我发现我无法覆盖 Opera 中 XMLHttpRequest 对象的 Accept 标头。如果您不担心,那就去做吧,这就是 HTTP 的工作原理。

我建议将您的 HTML 响应设置为具有比您的 JSON 响应更高的 q 值,但某些浏览器会发送 Accept: */*

【讨论】:

以上是关于关于使用 HTTP 请求头在网站 (HTML) 和 api (JSON) 之间切换的意见的主要内容,如果未能解决你的问题,请参考以下文章

各类 HTTP 返回状态代码详解

Django基础学习笔记

各类 HTTP 返回状态代码详解

各类http返回状态详解

HTTP/HTML/浏览器

请教,关于HTTP到SOCKS5的代理转换