解决方法1:使用CORS来提前声明可以共享
让对方在对应数据的resonse处设置响应头:
response.setHeader('Access-control-Allow-origin', 'http:xx对方的urlxxx')
如果要让所有人都获取,那么可以通过request.referer来获取访问者的网站,设置到setHeader的第二个参数上
然后由我方使用AJAX获取即可。
解决方法2:使用JSONP来设置
JSONP解决的是在IE下,不能用cors的方式来共享数据的问题
它的原理是第一步,让对方将文件写到一个js文件中,然后通过本方引用对方的JS文件,由于js文件是可引用的,从而获得到对方的内部数据。
它的细节技巧在于在本方处设置一个回调函数,然后对方那边调用这个回调函数,将回调函数的参数修改为要传递的json数据response.write出来,即可实现传递。
例如:本方设置一个函数
window.callback(data)=>(console.log(data))
对方新建一个js文件并写函数内容:
callback("{data}")
然后对方在响应的服务器代码中写:
if (path === '/friends.js') {//这里的friends.js就是对方新建的js文件
response.statusCode = 200
response.setHeader('Content-Type', 'text/javascript;charset=utf-8')
let string = fs.readFileSync('./friends.js').toString() // 需要转成字符串
let data = fs.readFileSync('./a.json').toString() // 获取要发送的json数据
let string2 = string.replace('"{data}"', data) //替换掉js文件里写的参数,换成json文件里的参数。
response.write(string2) //把替换好的内容写入response中
response.end()
}
由于我方跟对方的js文件同样设置了一个函数,并且引用了对方的js文件,故而就相当于对方执行了一个我方设置的回调函数,把数据以js文件合法的形式进行传输给我方获取。
JSONP的优点
优点为兼容ie并且可以跨域
缺点:因为是script引用传送所以不支持post。