2013-05-08 49 views
8

假设我使用ajax(例如通过jQuery)对实现PRG模式的API执行POST请求。因此,它会重定向我:那么重定向后从XHR对象获取最终url

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

jQuery将自动执行重定向,执行:

GET /some/other/location 

,然后调用响应处理器(成功,失败等)与输出从后者请求。但是,如何在javascript中读取最终资源的位置(本例中为/some/other/location)?

+0

根据[本答案](http://stackoverflow.com/a/8056313/759866),它正在最新的浏览器中实现。 – Benjamin 2016-06-20 21:49:32

回答

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 2013-05-15 18:56:46

4

XMLHttpRequest的不公开的最终URL。

,你可以破解这周围没有使用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添加页眉与内核听众:

服务

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

列表ener类

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