2013-05-08 17 views
8

PRGパターンを実装するAPIにPOST要求を行うためにajax(例:jQuery経由)を使用すると仮定します。したがって、それは私をリダイレクトします:リダイレクト後に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

答えて

5

を私の知る限りでは、それはXMLHttpRequestオブジェクトとはできません。しかし、あなたがあなたの[信頼された]ドメイン内で動作している場合、それは重要な情報だ場合、あなたの代わりにインラインフレームを使用することもできます。

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を公開していません。

:[

しかし、あなたはインラインフレームを使用しなくても、この周りをハックすることができます。

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

を、ポストリダイレクトURLを取得することをお読みください。あなたはJSONオブジェクトを返している場合は、以下のような、finalURLプロパティを追加することができます。希望があれば助かります!

0

これは古い投稿ですが、Googleで高く評価されていますので、私のソリューションを追加します。

ajaxレスポンスを制御できる場合は、レスポンスに最終的なURLを追加することができます。

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

PHPでは、これはのようなものになるでしょう。

その後、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()); 
    } 
} 
関連する問題