получение заголовка местоположения вызова ajax с прототипом javascript

В моем приложении javascript (с использованием прототипа) мне нужна некоторая информация со стороннего сервера, и этот сервер иногда требует веб-взаимодействия с пользователем, и по этой причине он отправляет http-код 302 с новым URL-адресом в заголовке Location. Я хочу захватить этот новый URL-адрес, чтобы открыть его в отдельном окне, однако метод getHeader('Location') всегда возвращает значение null. Есть идеи??? Это упрощенная версия моего кода:

UPDATE = function(){
new Ajax.Request(proxy_url,{
    method: 'post', 
    parameters: "p1=1&p2=2",
    on302: function(response){
        OpenURLfromLocation(response);
    },

    onSuccess: function(transport){
        alert("OK");
    }

});}
OpenURLfromLocation = function(response){
alert(response.getHeader('Location'));
}

Прокси-сервер ajax работает правильно, и я вижу на firebug, что он ведет себя правильно, пока не попытается восстановить местоположение из заголовка.


person 4NDR01D3    schedule 15.07.2009    source источник
comment
Когда вы смотрите на него в Firebug или Fiddler, вы видите заголовки? Имеет ли значение перевод строки в нижний регистр?   -  person epascarello    schedule 15.07.2009
comment
да, я вижу заголовки в firebug, я пытаюсь использовать строчные буквы и все равно получаю нулевое значение!   -  person 4NDR01D3    schedule 15.07.2009


Ответы (2)


Прошло много времени с тех пор, как я использовал Prototype, но в реальном объекте XMLHttpRequest имя метода — getResponseHeader. Однако, если вы контролируете ответ сервера, почему бы просто не вернуть новый URL в теле ответа?

В качестве примечания: если вы добавляете «местоположение» к заголовку ответа, отправляемому обратно с сервера, соглашение состоит в том, чтобы добавлять в заголовки все, что вы добавляете, с помощью «X-», поэтому у вас будет «X- Место нахождения"

person Justin Johnson    schedule 15.07.2009
comment
Спасибо... да... у меня есть жесткий отправка в качестве параметра, просто мне это не кажется правильным способом сделать это. Я думаю, должно быть возможно из javascript. Спасибо за подсказку по поводу X-заголовков. прототип просто маскирует этот метод, чтобы он возвращал null вместо того, чтобы генерировать исключение, как это делает исходный метод. - person 4NDR01D3; 15.07.2009
comment
Отправка его в шапке кажется мне странной. Данные ответа принадлежат телу ответа, заголовок предназначен для дополнительной/метаинформации. Итак, если местоположение является основными данными ответа, оно принадлежит телу. Если местоположение является дополнением к обычному ответу, который содержит другие данные в теле, то я полагаю, что передача в качестве заголовка имеет смысл в этом сценарии. - person Justin Johnson; 15.07.2009
comment
ммм... возможно, вы правы, я выберу это решение, но все же забавно, что firebug может извлечь этот заголовок, но я не могу из прототипа =( - person 4NDR01D3; 16.07.2009
comment
Да, это странно, но, как я уже сказал, прошло очень много времени с тех пор, как я использовал Prototype (еще в 2004 году), поэтому я больше не знаком с ним и не могу помочь с мелкими деталями. В любом случае, отметьте это как решение, чтобы мы знали, что этот вопрос решен;) - person Justin Johnson; 17.07.2009

Большинство браузеров считают запрос стороннего URL-адреса от ajax (XMLHttpRequest) нарушением безопасности. http://www.xml.com/pub/a/2005/11/09/fixing-ajax-xmlhttprequest-considered-harmful.html

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

Не уверен, что это на 100% отвечает на ваш вопрос, но, вероятно, это также следует учитывать в вашем случае здесь.

person txwikinger    schedule 15.07.2009
comment
У меня уже есть прокси, который занимается этой проблемой, и он отображает как контент, так и заголовки, и проблема все еще существует. Спасибо, в любом случае - person 4NDR01D3; 15.07.2009
comment
Может ли быть проблема масштаба? Попробуйте оповещение от OpenURLfromLocation внутри запроса Ajax или создайте функцию с именем вроде function OpenURLfromLocation(response){ alert(response.getHeader('Location')); } - person txwikinger; 15.07.2009