2014-09-22 5 views
4

Я выполняю запрос Ajax на сервер, который принимает междоменные запросы, но для которых у меня нет контроля над кодом сервера. Мое желание состоит в извлечении заголовка HTTP Link из ответа. В качестве примера:Извлечение HTTP-заголовков из ответов HTTP-300 с использованием Ajax

$.ajax({ 
url: theURL 
}).done(function(data,textStatus,xhr){}); 

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

HTTP/1.1 302 Found 
Link: <http://thedataIwant.com>;rel="foo" 
Location: http://someothersite.com 

Браузер следует код HTTP 3xx и я получаю содержимое заголовков HTTP от http://someothersite.com в обработчике done(); однако я хотел бы сначала извлечь содержимое заголовка Link для первоначального ответа HTTP с кодом 3XX.

Как я могу извлечь содержимое заголовка HTTP-ссылки из ответа HTTP с кодом состояния 3XX?

ответ

3

Я был заинтригован вашим вопросом и хотя бы поискать решение. К сожалению, нет прямого. Согласно всем сообщениям, которые я читал до сих пор (How to manage a redirect request after a jQuery Ajax call и многим подобным), вы не можете просто перехватить перенаправление 301, поскольку браузеры обычно извлекают контент и предоставляют конечную точку пользователю, поэтому вы получаете код состояния 200 вместо 302. В качестве обходного пути люди предлагают использовать настраиваемый заголовок. Когда вы получаете заголовок после выполнения запроса ajax, вы можете сделать свою собственную манипуляцию, то есть сохранить заголовок Link, а затем сделать второй запрос ajax, чтобы получить контент с MyRedirectLocationHeader: http://someothersite.com.

Код будет выглядеть что-то похожее на это:

$.ajax({ 
    url: theURL, 
    success: function(response, status, xhr) { 
     var link = xhr.getResponseHeader('Link'); 
     if(link != null) { 
      // my second ajax request to the link in the MyRedirectLocationHeader 
     } 
    } 
}); 

Это безобразны хак, но это только временное решение я нашел до сих пор, который на самом деле работает. Другим способом может быть создание сценария/службы proxy с использованием PHP, Java или другого аналогичного языка, который получит запрос без необходимости перенаправления и распечатает только Link и Location как JSON или XML. После этого ваш Javascript будет анализировать реакцию и приступить к someothersite.com

Что мне интересно, однако, является то, что официальная Jquery ajax documentation страница подразумевает, что имеется поддержка 3xx переадресовывает (около документации для statusCode), но это Безразлично» похоже, работает.

+0

Я был осторожен в использовании success(), поскольку он устарел, но даже в этом случае, похоже, что заголовок Link, полученный здесь, все еще получает свои данные из конечного адресата с кодом 200, а не с заголовком ответа от 3XX. –

+0

Возможно, потому, что вы все еще делаете ответ «перенаправление» 302. Вы должны вернуть код состояния '200' и ​​настраиваемый заголовок i.e. MyRedirectHeader: http: // someothersite.com' – tftd

+0

Вы хотите сказать, что я должен вернуть пользовательский заголовок с сервера? Если да, то на вопрос: «Я не контролирую код сервера». Если нет, уточните пожалуйста. Благодарю. –

Смежные вопросы