Mar*_*ouf 6 ajax json web-applications jax-rs content-negotiation
情况如下:
我有一个Web应用程序响应对资源列表的请求,让我们说:
/items
Run Code Online (Sandbox Code Playgroud)
这最初是由Web浏览器通过导航到该路径直接请求的.浏览器使用它的标准"Accept"标题,其中包含"text/html",我的应用程序注意到这一点,并返回项目列表的HTML内容.
在返回的HTML中是一些JavaScript(jQuery),然后执行ajax请求来检索实际数据:
/items
Run Code Online (Sandbox Code Playgroud)
只有这一次,"Accept"标头显式设置为"application/json".同样,我的应用程序注意到这一点,JSON正确地返回到请求,数据被插入到页面中,一切都很愉快.
出现问题:用户导航到另一个页面,然后按下BACK按钮.然后提示他们保存文件.这结果是项目列表的JSON数据.
到目前为止,我已经在Google Chrome和Firefox 3.5中证实了这一点.
这里有两种可能的答案:
我该如何解决这个问题.是否有一些神奇的Cache-Control标头组合或其他伏都教导致浏览器在这里做正确的事情?
如果你认为我在这里做了一些可怕的错误,我该怎么办呢?我正在寻求正确性,但也试图不牺牲灵活性.
如果有帮助,该应用程序是使用Restlet 2.0m4的JAX-RS Web应用程序.如果它有用,我可以提供示例请求/响应标头,但我相信这个问题是完全可重现的.
是否有一些神奇的Cache-Control标头组合或其他伏都教导致浏览器在这里做正确的事情?
如果您对不同的Accept:标头提供不同的响应,则必须包含标头:
Vary: Accept
Run Code Online (Sandbox Code Playgroud)
在你的回复中.该因人而异标题中还应包含影响响应任何其他请求头,因此,例如,如果你做的gzip/deflate压缩你必须包含的Accept-Encoding.
不幸的是Vary
,IE处理很多不好的值,完全破坏缓存,这对你来说可能或不重要.
如果你认为我在这里做了一些可怕的错误,我该怎么办呢?
我不认为在同一个URL上为不同类型提供不同内容的想法是非常错误的,但是你让自己陷入了比实际需要更多的兼容性问题.依靠通过JSON工作的头文件在实践中并不是一个好主意; 你最好只使用不同的URL,例如/items/json
或/items?format=json
.
归档时间: |
|
查看次数: |
591 次 |
最近记录: |