2013-05-08 2 views
8

Предположим, что я использую ajax (например, через jQuery) для запроса POST в API, который реализует шаблон PRG. Следовательно, он будет перенаправлять меня:Получить окончательный URL-адрес от объекта XHR после перенаправления

POST /some/api 
HTTP/1.1 303 See Other 
Location: /some/other/location 

JQuery будет автоматически следить за переадресацией и выполнить:

GET /some/other/location 

И затем вызвать обработчик ответа (успех, отказ и т.д.) с выходом из последнего запрос. Однако, как я могу прочитать местоположение конечного ресурса (/some/other/location в этом случае) в javascript?

+0

Согласно [этот ответ] (http://stackoverflow.com/a/8056313/759866), она реализуется в новейших браузерах. – Benjamin

ответ

0

Я считаю, что это невозможно вообще, хотя я вижу через Chrome Developer Tools, что браузер получает 303 ответ от сервера, а затем следует за перенаправлением.

Смотрите этот родственный вопрос и ответ: Is it possible for XHR HEAD requests to not follow redirects (301 302)

5

Насколько я знаю, это не представляется возможным с XMLHttpRequest объекта. Но, если вы работаете в вашем [доверенном] домене, и если это важная информация, вы могли бы использовать IFRAME вместо:

var hidden_iframe = document.createElement('iframe'); 
hidden_iframe.name = 'hidden_iframe'; 
hidden_iframe.style.display = 'none'; 
hidden_iframe.onload = function() { 
    console.log(hidden_iframe.contentWindow.location.toString()); 
} 
document.body.appendChild(hidden_iframe); 

var request = document.createElement('form'); 
request.method = 'post'; 
request.action = '/some/api'; 
request.target = 'hidden_iframe'; 
request.style.display = 'none'; 

// append INPUTs to the request form here 

document.body.appendChild(request); 
request.submit(); 

Вашей консоль должны сообщить 1 или несколько URL-адресов, последние из которых будет:

http(s)://{yourdomain}/some/other/location

+0

Благодарим вас за это предложение. Использование фреймов вместо 'XMLHttpRequest' получает немного волосатое с обработкой событий и т. Д. Но это может быть полезно в некоторых случаях. – Jeroen

4

XMLHttpRequest не выставляет окончательный URL.

  • Если вы используете Internet Explorer, есть свойство XMLHttpRequest.responseXML.url, но it doesn't work.
  • Если вы используете Firefox, есть свойство, называемое XMLHttpRequest.channel.URI, но это private and inaccessible.
  • Возможно, это будет в будущей спецификации someday.

: [

Но, вы можете взломать обойти это без использования IFRAME. Если вы возвращающая объект JSON, можно добавить свойство finalURL, как следующее:

{ "finalURL": "http://example.com/API/v2/request.json", "response": {...} } 

и прочитал, что, чтобы получить пост-переадресации URL. Надеюсь, это полезно!

0

Это старый пост, но он высоко ценится в Google, поэтому я добавлю свое решение.

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

В PHP это будет что-то вроде:

header('X-final-url: /some/other/location').

Затем в JQuery, вы можете получить это значение с:

var finalUrl = jqXHR.getResponseHeader('X-final-url');

добавить заголовок в Symfony с ядром слушателя:

Service

app.kernel.response_metadata_populator: 
    class: AppBundle\Listeners\ResponseMetadataPopulator 
    tags: 
     - { name: kernel.event_listener, event: kernel.response, method: onKernelResponse } 

Список Шенер Класс

class ResponseMetadataPopulator 
{ 
    /** 
    * @param FilterResponseEvent $event 
    */ 
    public function onKernelResponse(FilterResponseEvent $event) 
    { 
     $response = $event->getResponse(); 
     $response->headers->set('X-FINAL-URL', $event->getRequest()->getRequestUri()); 
    } 
} 
Смежные вопросы