3

我只是希望发布一些 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 并希望避免 preflight OPTIONS 请求。我也可以控制发球(尽管这无关紧要)。

4

2 回答 2

4

prefight OPTIONS 请求是 CORS 流的必需部分。没有其他办法了。但是,客户端可以缓存预检响应,因此它只需要实际发出一次预检请求,而不是每次发布。

要启用预检请求缓存,预检请求必须使用Access-Control-Max-Age标头进行响应。此标头的值是允许客户端缓存响应的秒数。

例如,以下响应标头将允许客户端将预检响应缓存 5 分钟。

Access-Control-Max-Age: 300

您必须选择适合您的应用程序的值。将此值设置为不太大的值通常是个好主意,以防您将来需要更改预检响应。如果您允许将预检请求缓存一个月,则用户可能要等到他们的缓存在一个月后过期后才能收到您的更改。

于 2015-06-17T05:02:10.437 回答
1

简单请求不需要预检请求。我猜这些json: true集是一个自定义Content-Type标题(很可能application/json)。

的简单值Content-Type是:

  • application/x-www-form-urlencoded
  • multipart/form-data
  • text/plain

这些值之外的任何内容都将触发预检请求。

于 2015-06-17T20:29:01.680 回答