在JavaScript中,跨域請(qǐng)求是指在客戶端向不同域名的服務(wù)器發(fā)送HTTP請(qǐng)求。由于瀏覽器的同源策略限制,默認(rèn)情況下不允許跨域請(qǐng)求。但是,有一些方法可以實(shí)現(xiàn)跨域請(qǐng)求,例如使用JSONP、CORS(跨域資源共享)或者代理服務(wù)器。
<script>
標(biāo)簽的src屬性不受同源策略限制的特點(diǎn)。JSONP請(qǐng)求實(shí)際上是動(dòng)態(tài)添加一個(gè)<script>
標(biāo)簽,將請(qǐng)求的URL作為src屬性的值。服務(wù)器返回的數(shù)據(jù)需要包裹在一個(gè)函數(shù)調(diào)用中,客戶端需要提前定義好這個(gè)函數(shù)。示例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JSONP Example</title>
<script>
function handleResponse(data) {
console.log(data);
}
</script>
<script src="http://example.com/api?callback=handleResponse"></script>
</head>
<body>
</body>
</html>
Access-Control-Allow-Origin
。客戶端可以使用XMLHttpRequest或Fetch API發(fā)起CORS請(qǐng)求。以下是一個(gè)使用Fetch API的示例:
fetch('http://example.com/api', {
method: 'GET',
mode: 'cors',
credentials: 'include'
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
示例(使用Node.js和Express搭建的簡(jiǎn)單代理服務(wù)器):
const express = require('express');
const fetch = require('node-fetch');
const cors = require('cors');
const app = express();
const port = 3000;
app.use(cors());
app.use('/api', (req, res) => {
const url = 'http://example.com/api' + req.originalUrl;
req.pipe(fetch(url)).then(response => response.text()).then(data => res.send(data));
});
app.listen(port, () => {
console.log(`Proxy server listening at http://localhost:${port}`);
});
客戶端請(qǐng)求代理服務(wù)器的API,代理服務(wù)器再將請(qǐng)求轉(zhuǎn)發(fā)到目標(biāo)服務(wù)器,從而實(shí)現(xiàn)跨域請(qǐng)求。