AJAX跨域POST發送json時,會先發送一個OPTIONS預請求


<a href="http://blog.163.com/sdhhqb@126/blog/static/637055372016112591913960/">原文鏈接</a>

前端開發中,有時在開發環境中需要調用后台的接口時,由於一些原因接口不支持跨域。這種情況我們一般可以通過用express建一個簡單的代理服務器,這個服務器接收所有的接口,並且允許跨域,比如本地頁面通過localhost:8081訪問,express服務器通過localhost:8082訪問。
最近一個項目中,請求接口時要求參數以json字符串方式post給服務器,結果以前沒問題的跨域代理不行了。檢查發現每次請求接口都會有兩個請求,先發送一個OPTIONS請求,網上查了一下,這是跨域非簡單請求時瀏覽器先會請求服務器驗證一下,這個請求成功返回瀏覽器才會允許跨域。以前的express代理,對所有的請求都會去請求接口服務器,OPTIONS請求到接口服務器沒有成功返回,所以跨域失敗了。修改一下express代理的代碼,設置對OPTIONS請求直接返回成功,就可以跨域代理了。
 
參考鏈接:
 
參考代碼:

var express = require('express');
var request = require('request');
var bodyParser = require('body-parser');

var app = express();
app.use(bodyParser.json()); // for parsing application/json
app.use(bodyParser.urlencoded({ extended: false })); // for parsing application/x-www-form-urlencoded

app.all('*', function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "Content-Type,Content-Length, Authorization, Accept,X-Requested-With");
res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
res.header("X-Powered-By",' 3.2.1')
res.header("Content-Type", "application/json;charset=utf-8");

var originalUrl = req.originalUrl;
option = {
url: 'http://algo.chiq-cloud.com/chiqalgo'+originalUrl,
method: "POST",
json: true,
body: req.body,
headers: {
"content-type":"application/json"
}
};

var method = req.method;
// OPTIONS請求直接返回成功
if (method == 'OPTIONS') {
res.status(200).send('{"test": "options ok"}');
return;
}
if (method == 'POST') {
option.method= "POST";
}
console.log(req.ip + ' ' + method + ' ' + originalUrl + ' ' + new Date().toLocaleString());

request(option, function (error, response, body) {
if (!error && response.statusCode == 200) {
res.send(body);
} else {
if (error) {
res.status(500).send(error);
} else {
res.status(500).send('remote error, status: ' + response.statusCode);
}
}
});
});

app.listen(8081);
console.log('Listening on port 8081...');


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM