jQuery и междоменные POST-запросы - PullRequest
7 голосов
/ 06 мая 2011

Я разрабатываю плагин jQuery, который будет соединителем для некоторого REST API.Реализация проста, но та же самая политика происхождения определенно болезненна.Мне нужно выполнять в основном POST-запросы.

Я также пытался реализовать метод OPTIONS и возвращать (это python, но смысл должен быть ясен)

def options(self):
  self.response.headers['Access-Control-Allow-Origin'] = self.request.host_url
  self.response.headers['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS'
  self.response.headers['Access-Control-Allow-Headers'] = 'x-requested-with'
  self.response.headers['Access-Control-Max-Age'] = '1728000'

все еще не работает... любая идея?

PS: я видел, что есть другой вопрос с похожей темой, но мне нужно конкретное решение для метода POST (GET может быть легко реализован с помощью iframes)

Пример JavaScript:

$.ajax({
    url: options.protocol+'://'+options.host+':'+options.port+'/'+method,
    data: rawData,
    async:false,
    dataType: "json",
    type:"POST",
    success:function(data)
    {
        alert('asd');
        result.data = data;
        alert(data);
    },
    error:function(lol){
        alert('omggg !!!!'+lol);
    }

});

РЕДАКТИРОВАТЬ: добавлен пример кода JavaScript

1 Ответ

9 голосов
/ 06 мая 2011

Иногда это немного скучно, некоторые мысли:

  • CORS поддерживается только довольно современными браузерами, поэтому вам нужно быть уверенным, что вы используете один из них.
  • IE поддерживает только CORS через объект XDomainRequest, а не стандартный объект XMLHttpRequest, но jQuery специально не учитывает это (пока; должен признать, я немного удивлени ожидаем, что это произойдет в ближайшее время ), поэтому вам нужно добавить специальную обработку, чтобы заставить эту работу работать в IE (а затем только в IE8 и выше). Редактировать : Шокирующе, но, очевидно, команда jQuery получила этот запрос и отклонила это: тикет # 8283 То есть нет sense.
  • Вы уверены в этом Access-Control-Allow-Origin значении?Он выглядит как будто он разрешает доступ только с того сервера, на котором он включен.Этот заголовок предназначен для указания источника, с которого сервер будет разрешать запрос .(И * разрешено, что означает "где угодно".)
  • Я, кажется, вспоминаю из моих экспериментов с Firefox, что он был привередлив в отношении моих разрешающих методов при ответе на запрос OPTIONS, что онне запрашивал.
  • Дважды проверьте, что вы разрешаете все заголовков, которые отправляет запрос;в вашем примере это выглядит так, как будто вы разрешаете только один заголовок (x-requested-with), но держу пари, что в текущем запросе будут другие.

FWIW (я не парень из Python)Вот мой JSP-код, который работает, возможно, он будет полезен - я думаю, что имена объектов достаточно ясны, чтобы их можно было читать, даже если вы не используете Java (и кто знает, может быть, вы делаете):

String corsOrigin, corsMethod, corsHeaders;

// Find out what the request is asking for
corsOrigin = request.getHeader("Origin");
corsMethod = request.getHeader("Access-Control-Request-Method");
corsHeaders = request.getHeader("Access-Control-Request-Headers");
if (corsOrigin == null || corsOrigin.equals("null")) {
    // Requests from a `file://` path seem to come through without an
    // origin or with "null" (literally) as the origin.
    // In my case, for testing, I wanted to allow those and so I output
    // "*", but you may want to go another way.
    corsOrigin = "*";
}

// Add headers allowing specifically what was requested
response.addHeader("Access-Control-Allow-Origin", corsOrigin);
response.addHeader("Access-Control-Allow-Methods", corsMethod);
response.addHeader("Access-Control-Allow-Headers", corsHeaders);
if (request.getMethod().equals("OPTIONS"))
{
    // Done, no body in response to OPTIONS
    return;
}
// Processing the GET or POST here; output the body of the response

Обратите внимание, что я использую точно такую ​​же логику для GET, POST и OPTIONS, за исключением того, что в случае OPTIONS я не выводю тело ответа.

...