我只想发布一些json,但默认情况下请求会执行预检OPTIONS请求。
我想避免这种情况,因为用户经常会有不可靠的连接,额外的请求会进一步降低可靠性并导致出现“CORS被拒绝”这样的神秘错误消息。
var request = require('request');
function (data, cb) {
if (!cb) cb = function () {};
request({
method: "POST",
url: "someurl",
json:true,
body: data
}, function (err, response, body) {
if (err) cb(err);
else if (response.statusCode != 200) {
cb(new Error("log satus code: " + response.statusCode));
} else {
cb(null, body);
}
})
澄清我正在做一个实际的CORS并希望避免预检OPTIONS请求。我也控制了发球(虽然这无关紧要)。
答案 0 :(得分:4)
预先选择OPTIONS请求是CORS流程的必需部分。没有其他办法了。但是,客户端可以缓存预检响应,因此它只需要实际执行一次预检请求,而不是每次POST时。
要启用预检请求缓存,预检请求必须使用Access-Control-Max-Age
标头进行响应。此标头的值是允许客户端缓存响应的秒数。
例如,以下响应标头将允许客户端将预检响应缓存5分钟。
Access-Control-Max-Age: 300
您必须选择适合您的应用的值。如果您需要在将来更改预检响应,通常最好将此值设置为不太大的值。如果您允许将预检请求缓存一个月,则用户可能无法获得您的更改,直到其缓存在一个月后过期。
答案 1 :(得分:1)
Simple requests不需要预检请求。我猜测json: true
设置了自定义Content-Type
标头(很可能是application/json
)。
Content-Type
的简单值为:
application/x-www-form-urlencoded
multipart/form-data
text/plain
除这些值之外的任何内容都会触发预检请求。