2015-06-16 2 views
3

Я просто хочу опубликовать несколько json, но по умолчанию запрос выполняет предпросмотр OPTIONS.Как избежать предпродажного запроса OPTIONS с пакетом запросов узла для CORS?

Я бы хотел избежать этого, так как пользователи часто имеют ненадежные соединения, дополнительный запрос дополнительно снижает надежность и приводит к загадочным сообщениям об ошибках, например «CORS reject».

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 и хочу избежать запроса опционных предлогов. У меня также есть контроль над подачей (хотя это не имеет значения).

+0

Пара вопросов ... 1) Является ли это на самом деле кросс-доменным запросом? Вы говорите, что запрос делает запрос CORS, когда это не является необходимым? 2) У вас есть контроль над сервисом, к которому вы выполняете POSTING? Или это третья сторона? – Jason

+0

Я отредактировал вопрос, чтобы включить запрошенную вами информацию. –

ответ

4

Запрос предварительной предварочной операции является обязательной частью потока CORS. Об этом нет. Тем не менее, клиент может кэшировать ответный сигнал перед полетом, поэтому ему нужно только сделать запрос предварительной проверки один раз, а не каждый раз, когда он отправляется.

Чтобы включить кэширование запроса перед полетом, запрос предварительной проверки должен отвечать заголовком Access-Control-Max-Age. Значение этого заголовка - это количество секунд, в течение которого клиенту разрешено кэшировать ответ.

Например, следующий заголовок ответа позволит клиенту кэшировать ответный сигнал перед полетом в течение 5 минут.

Access-Control-Max-Age: 300 

Вам нужно будет выбрать значение, подходящее для вашего приложения. Как правило, рекомендуется установить это значение для чего-то, что не слишком велико, если вам нужно изменить ответ предполета в будущем. Если вы разрешите кэшировать запрос на предполетный период в течение месяца, пользователи могут не получить ваши изменения, пока их кеш не истечет через месяц.

1

Simple requests не требуется предварительный запрос. Я предполагаю, что json: true устанавливает пользовательский заголовок Content-Type (скорее всего application/json).

Простые значения Content-Type являются:

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

Все за пределами этих значений вызовет предполетный запрос.