由于安全性和防盗链等原因吗,一般在服务端都会设置跨域限制,然而跨域限制一般只在浏览器端存在,对于服务端或IOS、Android等客户端是不存在的,使用代理是常见的解决方案,比如:Nginx反向代理,nodejs代理…
这里以API代理和图片代理为例,API来自知乎链接。
1.安装依赖
首先安装依赖npm install --save-dev request
2.设置代理域
1 2 3 4 5 6
| const http = require('http'); const request = require('request');
const hostname = '127.0.0.1'; const port = 8010; const imgPort = 8011;
|
3.创建一个API代理服务
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| const apiServer = http.createServer((req, res) => { const url = 'http://news-at.zhihu.com/api/2' + req.url; const options = { url: url };
function callback(error, response, body){ if(!error && response.statusCode === 200){ res.setHeader('Content-Type', 'text/plain;charset=UTF-8'); res.setHeader('Access-Control-Allow-Origin', '*'); res.end(body); } } request.get(options, callback); });
apiServer.listen(port, hostname, () => { console.log(`接口代理运行在http://${hostname}:${port}`); })
|
3.创建一个图片代理服务
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| const imgServer = http.createServer((req, res) => { const url = req.url.split('/img/')[1]; const options = { url: url, encoding: null }; function callback(error, response, body){ if(!error && response.statusCode === 200){ const contentType = response.headers['content-type']; res.setHeader('Content-Type', contentType); res.setHeader('Access-Control-Allow-Origin', '*'); res.end(body); } } request.get(options, callback); })
apiServer.listen(imgPort, hostname, () => { console.log(`图片接口代理运行在http://${hostname}:${imgPort}`); })
|
4.启动服务
node filename.js
通过node命令运行该js文件。
代理的核心是在返回的头部(response header)中添加一项Access-Control-Allow-Origin
为"*",允许所以域访问。这里监听了两个端口:8010和8011,比如真实的接口为:http://news.zhihu.com/api/2/news/latest, 开发时改写为:http://127.0.0.1:8010/news/latest; 图片真实地址为:http://pic2.zhihu.com/pic0.jpg, 开发时改写为:http://127.0.0.1:8011/img/http://pic2.zhihu.com/pic0.jpg。