2016-10-05 4 views
0

Я пытаюсь загрузить файл на стороне клиента Javascript, используя API-интерфейс Box, который перенаправляет запрос на временную ссылку загрузки после того, как файл был найден. Браузер блокирует перенаправление, однако, вызывая следующую ошибку:Redirect Failed on CORS Request

XMLHttpRequest не может загрузить https://api.box.com/2.0/files/file-id/content. Запрос был перенаправлен на «https://dl.boxcloud.com/d/1/some-big-hash/download», который запрещен для запросов с кросс-началом, которые требуют предполетной проверки.

На консоли сети я вижу три запроса: первый - это ВАРИАНТЫ (которые должны быть предполетными, потому что фактический код отправляет GET) с ответом 200, а во втором - идентичные запросы GET, которые оба получите 302'd (ожидаемый ответ для этого вызова API). Вот код, который делает запрос:

var xhr = new XMLHttpRequest(); 
xhr.open('GET', url); 
xhr.setRequestHeader('Authorization', 'Bearer '+MyToken); 
xhr.onload = function() 
{ 
    //some stuff 
} 
xhr.onerror = function() 
{ 
    //some other stuff 
} 
xhr.send(); 

Мой вопрос (а): Почему два GetS отправляются после предполетной возвращается обратно? И (b): Есть ли способ форматировать запрос, чтобы разрешить повторное перенаправление? И (c) если нет, могу ли я, по крайней мере, извлечь URL-адрес перенаправления из ответа и следовать ему с другим явным запросом? Каждый ответ в консоли содержит заголовок «Access-Control-Allow-Origin» с правильным началом.

Благодаря

+0

'второй второй идентичный запрос GET' - все идентично? –

+0

@Maximus заголовки запроса/ответа идентичны, единственное различие, которое я вижу, находится в столбце «инициатор» сетевой консоли Chrome; один говорит «https://api.box.com/2.0/files/file_id/content» (URL-адрес, по которому отправляется первоначальный запрос), а другой говорит «Другой» –

+0

, а URL-адрес тот же? –

ответ

1

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

+0

Любая идея, почему здесь требуется предварительный предлог? «Авторизация» считается настраиваемым заголовком? –

+1

Да, когда вы его устанавливаете сами, это определенно есть. https://fetch.spec.whatwg.org/#cors-safelisted-request-header имеет список надежных заголовков, которые не требуют предполета. – Anne