已知 JSON 文件在每个浏览器中看起来不同

Known JSON file looks different in each browser

这不是编程问题,但对某些开发人员来说会很有趣。

今天我遇到一个问题,用户询问有关在 C# 中解析 Json 数据的问题。没什么新鲜事,但他给了一个 link 和 Json 文件:

http://sapi.confirmtkt.com/api/platform/hotel/gethotels?city=Bangalore&checkinDate=08-01-2016&checkoutDate=09-01-2016&adults=2&rooms=1&children=0&childrenages=

该页面不再可用!.

如果您在 Google Chrome 中浏览上述 link,您会注意到该文件将显示为 XML。然后我检查了 Edge 中的 url,它显示了一个 Json 文件。

Google Chrome

边缘

我有点困惑。为什么 Google Chrome 将 Json 文件显示为 XML?

那是因为 Chrome 在 Accept HTTP header:

中发送不同的数据

Chrome的请求:

GET http://sapi.confirmtkt.com/api/platform/hotel/gethotels?city=Bangalore&checkinDate=08-01-2016&checkoutDate=09-01-2016&adults=2&rooms=1&children=0&childrenages= HTTP/1.1
Host: sapi.confirmtkt.com
Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.48 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: es,en;q=0.8

Edge的请求:

GET http://sapi.confirmtkt.com/api/platform/hotel/gethotels?city=Bangalore&checkinDate=08-01-2016&checkoutDate=09-01-2016&adults=2&rooms=1&children=0&childrenages= HTTP/1.1
Accept: text/html, application/xhtml+xml, image/jxr, */*
Accept-Language: es-CL,es;q=0.8,en-US;q=0.5,en;q=0.3
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586
Accept-Encoding: gzip, deflate
Host: sapi.confirmtkt.com
Connection: Keep-Alive

您可以在接受 header 中看到 Chrome 如何接受 application/xml;q=0.9。因此,我启动了 Fiddler 并拦截了 GET 请求,删除了接受 header 的那部分,现在服务器回复 json 而不是 XML.

TL;DR: 由于 Accept header,服务器对同一个 URL 返回两个不同的响应。 =16=]