2013-05-08 10 views
8

Załóżmy, że używam ajax (np. Przez jQuery), aby wykonać żądanie POST do interfejsu API, który implementuje wzorzec PRG. Stąd będzie przekierować mnie:Uzyskaj końcowy URL z obiektu XHR po przekierowaniu

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

jQuery będzie następnie automatycznie podążać za przekierowanie i wykonanie:

GET /some/other/location 

a następnie wywołać teleskopowe odpowiedzi (sukces, porażka, etc) z wyjściem z tej ostatniej żądanie. Jednak jak mogę odczytać lokalizację ostatecznego zasobu (/some/other/location w tym przypadku) w javascript?

+0

Według [ta odpowiedź] (http://stackoverflow.com/a/8056313/759866), to jest realizowane w najnowszych przeglądarkach. – Benjamin

Odpowiedz

5

O ile wiem, to nie jest to możliwe z obiektem XMLHttpRequest. Ale, jeśli jesteś działających w obrębie [zaufanego] domeny, a jeśli jest to istotne informacje, można użyć iframe Zamiast:

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(); 

Konsola powinna zgłosić 1 lub więcej adresów URL, z których ostatnia będzie:

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

+0

Dziękuję za tę sugestię. Używanie ramek zamiast 'XMLHttpRequest' staje się nieco owłosione podczas obsługi zdarzeń itp. Ale może być przydatne w niektórych przypadkach. – Jeroen

4

XMLHttpRequest nie narazić końcowy URL.

: [

Ale można włamać się obejść bez korzystania iframe. Jeśli wracasz obiekt JSON, można dodać obiekt finalURL, jak następuje:

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

i przeczytać, że aby uzyskać adres URL po przekierowanie. Mam nadzieję, że to pomocne!

0

To jest stary post, ale zajmuje on wysokie pozycje w Google, więc dodam moje rozwiązanie.

Jeśli masz kontrolę nad odpowiedzią ajax, możesz dodać nagłówek do odpowiedzi z ostatecznym adresem URL.

W PHP będzie to coś takiego:

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

Następnie w jQuery, można uzyskać dostęp do tej wartości z:

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

dodać nagłówek w Symfony z detektorem jądra:

Służby

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

Lista ENER Klasa

class ResponseMetadataPopulator 
{ 
    /** 
    * @param FilterResponseEvent $event 
    */ 
    public function onKernelResponse(FilterResponseEvent $event) 
    { 
     $response = $event->getResponse(); 
     $response->headers->set('X-FINAL-URL', $event->getRequest()->getRequestUri()); 
    } 
} 
Powiązane problemy