同一个地址,浏览器要 HTML、脚本要 JSON,怎么区分?Accept 里的 q 值怎么比?没有 Accept 头会怎样?语言怎么匹配?这篇逐项实测。
Accept → 服务端提供 ['application/json', 'text/html', 'text/csv'] 时选择 */* → 200 application/json curl 默认 application/json → 200 application/json text/html → 200 text/html; charset=utf-8 text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 → 200 text/html; charset=utf-8 Chrome 的导航请求 application/json, text/html → 200 application/json 同 q 值 text/html, application/json → 200 application/json 同 q 值,顺序相反 application/json;q=0.5, text/html;q=0.9 → 200 text/html; charset=utf-8 text/* → 200 text/html; charset=utf-8 image/png → 406 application/json 服务端没有的 application/json;q=0 → 406 application/json q=0 表示不接受 text/html;q=0, */*;q=0.1 → 200 application/json (无) → 406 application/json 没有 Accept 头 garbage → 406 application/json
上一篇:Range 请求与断点下载;下一篇:Jinja2 Template Loader。
{'accept_html': True, 'accept_json': True, 'best': 'text/html', 'json_in': True, 'quality_json': 0.8, 'values': [['text/html', 1], ['application/xhtml+xml', 1], ['application/xml', 0.9], ['*/*', 0.8]]} Accept: image/png → 406 {'error': 'not acceptable', 'offered': ['application/json', 'text/html', 'text/csv']} | Vary = Accept
Accept: application/json → Vary = AcceptAccept-Language: zh-CN,zh;q=0.9,en;q=0.8 → best_match(zh-CN, zh-TW, en, en-GB, ja; default=en) = zh-CN Accept-Language: zh → best_match(zh-CN, zh-TW, en, en-GB, ja; default=en) = zh-CN Accept-Language: zh-TW → best_match(zh-CN, zh-TW, en, en-GB, ja; default=en) = zh-TW Accept-Language: en-US,en;q=0.9 → best_match(zh-CN, zh-TW, en, en-GB, ja; default=en) = en Accept-Language: fr → best_match(zh-CN, zh-TW, en, en-GB, ja; default=en) = en Accept-Language: ja;q=0.5, en;q=0.9 → best_match(zh-CN, zh-TW, en, en-GB, ja; default=en) = en Accept-Language: * → best_match(zh-CN, zh-TW, en, en-GB, ja; default=en) = zh-CN Accept-Language: (无) → best_match(zh-CN, zh-TW, en, en-GB, ja; default=en) = en
gzip, deflate, br → gzip q=1 br q=1 identity q=0 gzip;q=0, identity → gzip q=0.0 br q=0 identity q=1 br;q=1.0, gzip;q=0.8, *;q=0.1 → gzip q=0.8 br q=1.0 identity q=0.1 (无) → gzip q=0 br q=0 identity q=0
GET /ext.json → 200 application/json GET /ext.html → 200 text/html; charset=utf-8 GET /ext.xml → 404 text/html; charset=utf-8
curl 默认: {"accept":"*/*","ae":null,"ua":"curl/8.7.1"}
requests 默认: {"accept":"*/*","ae":"gzip, deflate, zstd","ua":"python-requests/2.34.2"}