JQuery CORS запрос не работает при отправке запроса Range - PullRequest
10 голосов
/ 22 марта 2012

Я использую ajax-вызов jQuery, чтобы сделать запрос CORS, и он работает, если я установил

var headers = {};

Но так как контент, который я пытаюсь получить, довольно большой, я хотел бы отправить диапазонзаголовки.

(все это проверено и работает в одном домене)

Итак, когда я делаю это:

var headers = {"Range":"bytes=" + start + "-" + end};


$.ajax({
    url:url,
    type:type,
    headers:headers,
    dataType:dataType,
    success:function (data, status, jqXHR) {

        //

    }, error:function (data, status, jqXHR) {

       //
    }
});

В наш другой домен запрос отменяется в последнем chromeи FF.

Если я отключаю заголовки, все работает, но затем я получаю мегабайты данных, и браузер не может обрабатывать / анализировать этот объем данных.

Вот заголовки с сервера (я управляю этим, чтобы я мог его редактировать)

Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: OPTIONS, GET, POST
Access-Control-Allow-Headers: Content-Type, Authorization, Accept, Range, Origin
Access-Control-Expose-Headers: Content-Range
Access-Control-Max-Age: 3600

Я сделал что-то не так, или отправка запроса диапазона через CORS еще не реализована должным образом в последних браузерах?

(Примечание: также chrome не возвращает заголовки, даже если я разрешаю их в Expose-Headers, но это известная ошибка в списке рассылки chromium, но я могу сначала сделать один запрос на получение размера файла)

1 Ответ

9 голосов
/ 04 апреля 2012

У меня была похожая проблема при работе над моим последним проектом. Вот что я сделал:

1) на дескрипторе серверной стороны запрос OPTIONS, возвращающий заголовки Access-Control, например:

Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST, OPTIONS
Access-Control-Max-Age: 1000
Access-Control-Allow-Headers: Origin, Content-Type, Accept

2) на методе POST дескриптора сервера и добавьте заголовок

Access-Control-Allow-Origin: *

3) в JavaScript:

jQuery.ajax({
        url: gate,
        type: "POST",
        data: JSON.stringify(post_data),
        contentType: "application/json; charset=UTF-8",
        crossDomain: true,
        success: function(data){
            //
        },
    });

Надеюсь, это поможет

...