使用EventSource请求JSON文件时出现NetworkError:406 Not Acceptable问题求助
这个406错误的核心原因是EventSource的默认请求头和服务器返回的JSON响应类型不兼容,我来给你拆解问题并提供几个可行的解决方案:
为什么会出现这个错误?
当你用new EventSource()发起请求时,浏览器会自动给请求加上Accept: text/event-stream的HTTP头——这是因为EventSource是专门为**Server-Sent Events(SSE)**设计的,它期望服务器返回符合SSE规范的事件流数据,而非普通的JSON。
而你的服务器返回的.json文件,默认的Content-Type是application/json。当服务器检测到请求的Accept头(只接受text/event-stream)和自身返回的Content-Type不匹配时,就会返回406 Not Acceptable错误。
解决方案
方案1:改用普通HTTP请求(最适合静态JSON场景)
如果你只是要获取一次静态GeoJSON数据,完全没必要用EventSource——它本来是用来处理持续的实时数据流的。换成fetch或者XMLHttpRequest更简单直接,还能避免请求头不兼容的问题:
// 用fetch替代EventSource fetch('/liveMap/pesron1.json') .then(response => { if (!response.ok) throw new Error('请求失败'); return response.json(); // 直接解析JSON }) .then(data => { console.log('data ', data); // 这里处理你的GeoJSON数据,比如渲染地图等 }) .catch(error => { console.log('error...', error); });
方案2:修改服务器配置,让JSON文件支持text/event-stream头
如果你坚持要用EventSource(比如之后要扩展成实时SSE流),可以修改服务器配置,让.json文件在接收到Accept: text/event-stream请求时,返回text/event-stream的Content-Type:
Nginx配置示例:
location ~* \.json$ { types { text/event-stream json; } }
Apache配置示例:
AddType text/event-stream .json
方案3:将JSON包装成SSE格式
另外,EventSource只能解析符合SSE规范的数据流——每条数据必须以data:开头,结尾用两个换行符。你可以把你的JSON文件内容改成这样:
data: {"type":"FeatureCollection","features":[{"type":"Feature","id":"1850220292","geometry":{"type":"Point","coordinates":[51.4220625,35.7131196]},"properties":{"id":"1850220292","Description":"","Url":"liveMap/3131.json","Date":"1396/10/07 12:40:08","Accuracy":"19.573","Bearing":"0","Speed":"0","Direction":"0","GPSState":"0","PowerState":"0","Latitude":"35.7131196","Longitude":"51.4220625","BusinessName":"m-Ali","LocationName":""}}]}
同时配合方案2的服务器配置,EventSource就能正常解析这个数据了。
内容的提问来源于stack exchange,提问作者Mona Baharlou

