ajax请求本地json文件,谷歌浏览器报跨域错误

前端在做页面的时候,有时候需要可能为了测试某一功能,或者为了自己做demo,会访问本地json文件,获取数据,进行处理;但最近发现使用ajax请求json文件的时候,谷歌浏览器报错如下:
Access to XMLHttpRequest at ‘file:///…’ from origin ‘null’ has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https.
意即:跨域请求仅支持协议方案:http、data、chrome、chrome-extension、https。换句话说,认识访问本地文件是跨域行为,谷歌浏览器的安全机制会使得跨域失败。至于为什么,表示看了一些前人总结,我只总结出几句话“谷歌浏览器的安全策略,禁止ajax访问本地的文件,这是不安全的不被允许的”。
经测试,火狐、IE都是可以访问本地ajax文件,没有跨域问题的。
解决谷歌浏览器需要请求本地json文件:

1、jsonp(jsonp请求本地与请求其他服务器有不一样的用法)

2、项目中使用nginx反向代理(自行了解,nginx是个不错的代理服务器)

3、在webstorm中打开(webstorm中自带了一个本地服务器,会在浏览器中开一个端口)

4、修改谷歌浏览器的配置(不知怎么修改,且不实用)

综上,此处采取最经常实用的jsonp请求,经过自己实践和总结直接写出经验:ajax是无法在谷歌之下请求到本地文件的,与jsonp的配合也是用在访问其他服务器。

jsonp请求json文件方法:

1、jsonp请求本地json文件
不知道大家在使用script的src属性引入CDN文件的时候,有没有注意到这是一个不用考虑跨域的请求其他服务器并成功获取文件的方式。所以,请求本地文件就是使用“script的src + jsonp方式”,具体用法如下:

json文件

callbackFun({
    "data": [{
        "id": 1,
        "name": "z"
    },{
        "id": 2,
        "name": "m"
    }]
})
// 此处的callbackFun与下面的函数名对应

html页面中

<script type="text/javascript">
	function callbackFun (data) {
        console.log(data);
	}
</script>

<script src="./data.json?callback=callbackFuc"></script>
// callback代表json的回调函数,callbackFun为回调函数名,及你要进行处理数据的函数名
// callbackFun回调函数必须放在前面
2、jsonp + ajax请求其他服务器文件
$.ajax({
    async : true,
    url : "https://xxx/xx/xx",
    type : "GET",
    dataType : "jsonp", // 返回的数据类型,设置为JSONP方式
    jsonp : 'callback', //指定一个查询参数名称来覆盖默认的 jsonp 回调参数名 callback
    jsonpCallback: 'handleResponse', //设置回调函数名
    data : {}, 
    success: function(response, status, xhr){
        console.log('状态为:' + status + ',状态是:' + xhr.statusText);
        console.log(response);
    }
});

// 也可以通过getJSON
$.getJSON("https://xxxx?xx=xx&xx=xx&callback=?", function(data){
                console.log(data);
 });
### 如何在Google Chrome浏览器中发送POST请求 #### 使用JavaScript (jQuery) 发送POST请求 为了通过JavaScript在Chrome浏览器中发起一个的`POST`请求,可以利用`jQuery.ajax()`方法。此方式允许设置多个参数来定制HTTP请求的行为。 ```javascript $.ajax({ type: 'POST', url: 'https://to.com/postHere.php', // 请求的目标URL crossDomain: true, // 明确指出这是一个请求 data: '{"some":"json"}', // 要提交的数据,这里是以JSON字符串的形式给出 dataType: 'json', // 预期服务器返回的内容类型 success: function(responseData, textStatus, jqXHR) { var value = responseData.someKey; }, error: function (responseData, textStatus, errorThrown) { alert('POST failed.'); } }); ``` 上述代码片段展示了如何配置并执行一次异步的`POST`操作[^1]。 对于现代Web开发环境而言,在Chrome浏览器里处理CORS(Cross-Origin Resource Sharing)预检请求也是至关重要的。当客户端尝试向不同源发出特定类型的请求时,浏览器会先自动发送一个带有`OPTIONS`方法的预检请求给目标资源所在的服务器,询问实际请求是否安全可接受;只有得到肯定答复之后才会继续真正意义上的`GET`, `HEAD` 或者 `POST`等请求。这一过程通常由浏览器内部管理而无需开发者额外干预,不过理解其工作原理有助于排查可能出现的问题[^2]。 值得注意的是,除了借助第三方库如jQuery之外,还可以直接运用原生Fetch API来进行更简洁的操作: ```javascript fetch('https://example.com/api/data', { method: 'POST', mode: 'cors', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ some: "data" }) }) .then((response) => response.json()) .then((data) => console.log(data)) .catch((error) => console.error('Error:', error)); ``` 这段脚本同样实现了向指定地址发送带有效载荷(`body`) 的`POST`请求,并指定了响应解析的方式以及错误捕捉机制。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值