React Native Expo调用Fantasy API报JSON输入意外结束错误求助
解决React Native Expo解析Fantasy API JSON时的SyntaxError问题
我帮你排查下这个SyntaxError: Unexpected end of JSON input的问题——这种错误一般是因为服务器返回的内容不是有效的JSON,或者响应在传输过程中被截断了。结合你说的Postman能正常获取、其他API用这段代码没问题的情况,可以试试下面几个方案:
1. 先排查原始响应内容
在直接解析JSON之前,先打印响应状态和原始文本,看看服务器到底返回了什么(比如是不是403、404这类错误页面,或者空内容)。修改你的代码如下:
fetch("https://fantasy.premierleague.com/api/bootstrap-static/", { method: "GET", headers: { Accept: 'application/json', 'Content-Type': 'application/json', }, }) .then((res) => { console.log("响应状态码:", res.status); return res.text(); // 先获取原始文本,不要直接转JSON }) .then((rawText) => { console.log("原始响应内容:", rawText); try { const data = JSON.parse(rawText); console.log("解析后的数据: ", data); } catch (parseErr) { console.log("JSON解析错误详情:", parseErr); } }) .catch((err) => { console.log("请求错误: " + err); });
如果打印出的是HTML页面或者非JSON内容,那说明服务器没有返回预期的响应,大概率是请求头的问题。
2. 移除多余的Content-Type请求头
GET请求不需要设置Content-Type(这个头是用来告诉服务器你发送的请求体格式的,而GET请求没有请求体)。有些API会对不必要的请求头敏感,试试去掉它:
fetch("https://fantasy.premierleague.com/api/bootstrap-static/", { method: "GET", headers: { Accept: 'application/json', // 删掉'Content-Type': 'application/json'这一行 }, }) .then((res) => res.json()) .then((data) => console.log("DATA: ", data)) .catch((err) => console.log("Error: " + err));
3. 添加User-Agent请求头
很多API会验证请求的User-Agent字段,Postman默认会带上一个类似浏览器的User-Agent,而Expo的fetch可能用的是默认的原生客户端标识,导致服务器拒绝返回正确内容。试试加上一个常见的浏览器User-Agent:
fetch("https://fantasy.premierleague.com/api/bootstrap-static/", { method: "GET", headers: { Accept: 'application/json', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36', }, }) .then((res) => res.json()) .then((data) => console.log("DATA: ", data)) .catch((err) => console.log("Error: " + err));
4. 检查Expo开发环境的网络配置
如果上面的方法都没用,可以检查下Expo的网络设置:
- 对于Android,在
app.json的android字段里添加"usesCleartextTraffic": true,确保允许HTTP请求(不过这个API是HTTPS的,可能不是这个问题); - 确认你的开发设备和Expo服务器在同一个网络下,没有代理或者防火墙拦截请求。
一般来说,添加User-Agent或者移除多余的Content-Type就能解决这个问题,因为Fantasy Premier League的API对请求头有一定的验证要求。
内容的提问来源于stack exchange,提问作者Omar Diaa
相关产品推荐
相关产品推荐

