2016-12-08 4 views
0

私はバニラjsで私のサーバーに小さな非同期GET要求をしました。Javascriptを非同期にしないでくださいXMLHttpRequestはデフォルトでXMLHttpRequestリクエストヘッダーを設定しますか?

var rReq = new XMLHttpRequest(); 
     rReq.onload = function (e) { 
      window.updateCartnRows(e.target.response); 
     }; 
     rReq.open('GET', '/usr/cart/xhrRemoveItemsByType/' + type, true);  
     rReq.responseType = 'text'; 
     rReq.send(); 

クライアントの観点からは期待どおりに動作しますが、私のサーバーは、非同期要求としてそれを扱っていない、私はそれを設定した場合、それはXHRチェックに失敗しました。

均等jQueryの要求が正常に動作します:

$.get('/usr/cart/xhrRemoveItemsByType/' + type, function (e) { 
     console.log(e); 
     window.updateCartnRows(e); 
    }); 

X-要求-でjQueryの要求にデフォルトで設定されていた "XMLHttpRequestの" HTTPヘッダの差。このヘッダーを設定する必要について言及したもの、のためだけの真のパラメータ(例えばMDN

rReq.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); 

しかし、私はドキュメントのように、このソリューションについての疑問にいる: 私はバニラJSクエリは、この行で固定することができることを見出していませんXMLHttpRequest.open()メソッドでは非同期です。

答えて

1

まず、リクエストが非同期であるかどうかと、要求がXMLHttpRequestオブジェクトから発信されたものかどうかは、互いに関係がありません。

XMLHttpRequest specificationには、そのヘッダーを設定する必要があります。歴史的に、いくつかの実装がそれを設定しましたが、それは標準化されたものではありません。

jQueryのソースコードでは、jQueryのXHRラッパーを使用して要求されたため、そのヘッダーを明示的に設定します(クロスオリジン要求を除く)。

リクエストにヘッダーを追加する場合は、質問に含まれているコードを使用してsetRequestHeaderと追加してからsendに電話をかけるだけです。

+0

私は、XMLHttpRequestは常に非同期ではないことを理解していますが、非同期XMLHttpRequestを送信しています。 (xhrReq.open(method、url、async);を使用してasyncをtrueにする)。ドキュメントを読んだ後、私はそれが何らかの形でサーバーの非同期(httpヘッダー経由で)としてマークされると期待していました。 – SMetana

+0

@SMetana:いいえ。 :-)サーバーは、クライアントが要求の完了を待っているかどうかを気にしません。 (また、2番目の引数に 'true'を渡すと、それを残すことはありません。引数のデフォルト値は' true'です。) –

1

XMLHttpRequestは、httpリクエストを送信するためにクライアントhttpです。 httpプロトコルにはasync/syncはありません。それは単にブラウザのビューです。

1

ヘッダを設定すると、jQueryの具体的な事はあなたが私はそれを設定するの実装はまっすぐ進むと、正しいバックエンドが必要な場合はあると思いWhat's the point of the X-Requested-With header?

でそうする理由の詳細を読むことができhttps://github.com/jquery/jquery/blob/master/src/ajax/xhr.js#L59

参照ですそれ。

+0

これを指摘してくれてありがとう。 jqueryの作者が同じようにすると、私はこの解決策についてより自信を持っています。 – SMetana

関連する問題