2013-05-08 26 views
8

Bir PRG deseni uygulayan bir API'ye POST isteğinde bulunmak için ajax (ör. JQuery aracılığıyla) kullandığımı varsayalım. Bu yüzden beni yönlendirir:Yönlendirdikten sonra XHR nesnesinden son URL'yi alın

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

jQuery otomatik yönlendirmeyi izlemek ve gerçekleştirir:

GET /some/other/location 

Sonra ikincisi dan çıkışı ile tepki işleyicileri (başarılı, başarısız, vs) diyoruz istek. Ancak, javascript'te son kaynağın konumunu (bu durumda /some/other/location) nasıl okuyabilirim?

+0

göre [Bu cevap] (http://stackoverflow.com/a/8056313/759866), en son tarayıcılarda uygulanmaktadır. – Benjamin

cevap

5

olarak bildiğim kadarıyla, o XMLHttpRequest nesneyle mümkün değildir. Ancak sizin de [güvenilen] etki alanı içinde faaliyet gösteren ediyoruz ve bu önemli bilgiler ise, bunun yerine bir çerçeve kullanır eğer:

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 veya daha fazla URL bildirmelidir Sizin konsol, son hangi olacaktır:

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

+0

Bu öneri için teşekkür ederiz. "XMLHttpRequest" yerine karelerin kullanılması, olay işleme, vb. Ile biraz kıllı olur. Ancak, bazı durumlarda yararlı olabilir. – Jeroen

4

XMLHttpRequest nihai URL'yi göstermiyor.

: [

Ama, bir iframe kullanmadan bu sorunu kesmek olabilir.

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

ve post-yönlendirme URL'sini almak için okumak: Eğer bir JSON nesnesi dönen ediyorsanız, aşağıdaki gibi bir Son URL özelliğini ekleyebilir. Umarım bu yardımcı olur!

0

Bu eski bir gönderidir, ancak Google’da yüksek oranda yer aldığından çözümümümü ekleyeceğim.

ajax yanıtı üzerinde kontrole sahipseniz, yanıtın son URL'yle bir üstbilgi ekleyebilirsiniz.

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

PHP böyle bir şey olurdu.

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

Bir çekirdek dinleyici ile Symfony'ninyılında başlığını ekleyin::

Sonra jquery, sizinle bu değeri erişebilirsiniz

Servis

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

Liste Şener Sınıf

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