8

假设我使用 ajax(例如通过 jQuery)向实现 PRG 模式的 API 发出 POST 请求。因此它会重定向我:

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

然后 jQuery 将自动跟随重定向并执行:

GET /some/other/location

然后使用后一个请求的输出调用响应处理程序(成功、失败等)。但是,如何/some/other/location在 javascript 中读取最终资源的位置(在这种情况下)?

4

5 回答 5

7

虽然这是一篇旧帖子,但希望这个更新的(2018 年)答案会对某人有所帮助。请注意,此解决方案不适用于 Internet Explorer(任何版本),仅适用于其他浏览器的相对现代版本。

XMLHttpRequest现在公开一个名为 的只读属性,该属性在发生任何重定向后responseURL返回响应的 URL 。

var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://example.com', true);
xhr.onload = function () {
  console.log(xhr.responseURL); // Prints http://example.com
};
xhr.send();

请参阅https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/responseURL上的文档

于 2018-12-10T22:06:48.260 回答
5

据我所知,这个对象是不可能的XMLHttpRequest。但是,如果您在 [trusted] 域中操作,并且它是重要信息,则可以使用 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

于 2013-05-15T15:40:47.580 回答
4

XMLHttpRequest 不公开最终 URL。

:[

但是,您可以在不使用 iframe 的情况下解决这个问题。如果要返回 JSON 对象,则可以添加 finalURL 属性,如下所示:

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

并阅读以获取重定向后的 URL。希望这会有所帮助!

于 2013-09-26T21:44:19.627 回答
0

我相信这通常是不可能的,尽管我可以通过 Chrome 开发者工具看到浏览器确实从服务器获得 303 响应,然后遵循重定向。

请参阅此相关问题和答案:XHR HEAD 请求是否可能不遵循重定向 (301 302)

于 2013-05-10T12:15:38.290 回答
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 }

监听类

class ResponseMetadataPopulator
{
    /**
     * @param FilterResponseEvent $event
     */
    public function onKernelResponse(FilterResponseEvent $event)
    {
        $response = $event->getResponse();
        $response->headers->set('X-FINAL-URL', $event->getRequest()->getRequestUri());
    }
}
于 2017-01-16T05:03:51.467 回答