1. 序論
このセクションは規範的ではありません。
XMLHttpRequest
オブジェクトは、リソースを取得するためのAPIです。
XMLHttpRequest
という名前は歴史的なものであり、その機能には関係ありません。
ネットワーク経由で取得したXMLドキュメントからデータを処理する簡単なコードの例です:
function processData( data) {
// データの処理
}
function handler() {
if ( this . status == 200 &&
this . responseXML != null &&
this . responseXML. getElementById( 'test' ). textContent) {
// 成功!
processData( this . responseXML. getElementById( 'test' ). textContent);
} else {
// 何かがうまくいかなかった
…
}
}
var client = new XMLHttpRequest();
client. onload = handler;
client. open( "GET" , "unicorn.xml" );
client. send();
サーバーにメッセージを記録するだけの例:
function log( message) {
var client = new XMLHttpRequest();
client. open( "POST" , "/log" );
client. setRequestHeader( "Content-Type" , "text/plain;charset=UTF-8" );
client. send( message);
}
サーバー上のドキュメントのステータスを確認する場合:
function fetchStatus( address) {
var client = new XMLHttpRequest();
client. onload = function () {
// ネットワークエラーの場合、これは信頼できる結果を提供しない可能性があります
returnStatus( this . status);
}
client. open( "HEAD" , address);
client. send();
}
1.1. 仕様の歴史
XMLHttpRequest
オブジェクトは、WHATWGのHTMLの取り組みの一環として最初に定義されました。(それ以前のMicrosoftの実装に基づくものです。)
2006年にW3Cに移行しました。XMLHttpRequest
の拡張機能(例:進捗イベントやクロスオリジンリクエスト)は、2011年末まで
別のドラフト(XMLHttpRequest Level 2)で開発され、その後2つのドラフトが統合され、標準の観点からXMLHttpRequest
は再び単一のエンティティになりました。2012年末にWHATWGに戻りました。
現在のドラフトにつながる議論は、以下のメーリングリストアーカイブで見つけることができます:
2. 用語
この仕様書はInfra Standardに依存しています。[INFRA]
この仕様書は、DOM、DOM Parsing and Serialization、Encoding、Fetch、File API、HTML、URL、Web IDL、およびXMLからの用語を使用します。
[DOM] [DOM-PARSING] [ENCODING] [FETCH] [FILEAPI] [HTML] [URL] [WEBIDL] [XML] [XML-NAMES]
3. インターフェース XMLHttpRequest
[Exposed =(Window ,DedicatedWorker ,SharedWorker )]interface :XMLHttpRequestEventTarget EventTarget { // event handlersattribute EventHandler onloadstart ;attribute EventHandler onprogress ;attribute EventHandler onabort ;attribute EventHandler onerror ;attribute EventHandler onload ;attribute EventHandler ontimeout ;attribute EventHandler onloadend ; }; [Exposed =(Window ,DedicatedWorker ,SharedWorker )]interface :XMLHttpRequestUpload XMLHttpRequestEventTarget { };enum {XMLHttpRequestResponseType ,"" ,"arraybuffer" ,"blob" ,"document" ,"json" }; ["text" Exposed =(Window ,DedicatedWorker ,SharedWorker )]interface :XMLHttpRequest XMLHttpRequestEventTarget {constructor (); // event handlerattribute EventHandler onreadystatechange ; // statesconst unsigned short UNSENT = 0;const unsigned short OPENED = 1;const unsigned short HEADERS_RECEIVED = 2;const unsigned short LOADING = 3;const unsigned short DONE = 4;readonly attribute unsigned short readyState ; // requestundefined open (ByteString ,method USVString );url undefined open (ByteString ,method USVString ,url boolean ,async optional USVString ?=username null ,optional USVString ?=password null );undefined setRequestHeader (ByteString ,name ByteString );value attribute unsigned long timeout ;attribute boolean withCredentials ; [SameObject ]readonly attribute XMLHttpRequestUpload upload ;undefined send (optional (Document or XMLHttpRequestBodyInit )?=body null );undefined abort (); // responsereadonly attribute USVString responseURL ;readonly attribute unsigned short status ;readonly attribute ByteString statusText ;ByteString ?getResponseHeader (ByteString );name ByteString getAllResponseHeaders ();undefined overrideMimeType (DOMString );mime attribute XMLHttpRequestResponseType responseType ;readonly attribute any response ;readonly attribute USVString responseText ; [Exposed =Window ]readonly attribute Document ?responseXML ; };
XMLHttpRequest
オブジェクトには次の関連付けがあります:
- アップロードオブジェクト
XMLHttpRequestUploadオブジェクト。- 状態
- 未送信、オープン済み、ヘッダー受信済み、読み込み中、および 完了 のいずれか。 初期値は 未送信。
send()呼び出し済み- boolean。初期値は false。
- タイムアウト
- 符号なし整数。初期値は 0。
- オリジン間 資格情報
- boolean。初期値は false。
- 要求メソッド
- メソッド。
- 要求 URL
- URL。
- 作者要求 ヘッダー
- ヘッダーリスト。初期状態では空。
- 要求本体
- 初期値は null。
- 同期
- boolean。初期値は false。
- アップロード 完了
- boolean。初期値は false。
- アップロード リスナー
- boolean。初期値は false。
- タイムアウト済み
- boolean。初期値は false。
- 応答
- 応答。初期値は ネットワークエラー。
- 受信済みバイト
- バイト列。初期状態では空のバイト列。
- 応答型
- 空文字列、"
arraybuffer"、"blob"、 "document"、"json"、および "text" のいずれか。初期値は空文字列。 - 応答オブジェクト
- オブジェクト、失敗、または null。初期値は null。
- fetch コントローラー
- fetch コントローラー。初期値は新しい fetch
コントローラー。
send()メソッドは、それを有用な fetch コントローラー に設定するが、簡潔にするため、これは常に fetch コントローラー を保持する。 - 上書き MIME 型
- MIME
型 または null。初期値は null。 値を取得できる場合がある。
それは
overrideMimeType()が呼び出されたときである。
3.1. コンストラクター
client = new XMLHttpRequest()- 新しい
XMLHttpRequestオブジェクトを返します。
new XMLHttpRequest()
コンストラクターの手順は次の通りです:
-
thisの アップロードオブジェクトを新しい
XMLHttpRequestUploadオブジェクトに設定します。
3.2. ガベージコレクション
XMLHttpRequest
オブジェクトは、その
状態 が、
send()
呼び出し済み が true である オープン済み、
ヘッダー受信済み、または 読み込み中 のいずれかであり、かつ
type が次のいずれかである
イベントリスナー
が 1 つ以上登録されている場合、ガベージコレクトされてはならない:
readystatechange、
progress、
abort、
error、
load、
timeout、
および
loadend。
XMLHttpRequest
オブジェクトが接続がまだ開いている状態でガベージコレクションされた場合、ユーザーエージェントは
終了しなければなりません。そのXMLHttpRequest
オブジェクトの
フェッチコントローラーを。
3.3. イベントハンドラー
次に挙げるものは、イベントハンドラー(およびそれに対応するイベントハンドラーイベントタイプ)
であり、XMLHttpRequestEventTarget
を継承するインターフェースを実装するオブジェクト上で属性としてサポートされなければなりません:
| イベントハンドラー | イベントハンドラーイベントタイプ |
|---|---|
onloadstart
| loadstart
|
onprogress
| progress
|
onabort
| abort
|
onerror
| error
|
onload
| load
|
ontimeout
| timeout
|
onloadend
| loadend
|
次に挙げるものはイベントハンドラー(およびそれに対応するイベントハンドラーイベントタイプ)であり、XMLHttpRequest
オブジェクトのみで属性としてサポートされなければなりません:
| イベントハンドラー | イベントハンドラーイベントタイプ |
|---|---|
onreadystatechange
| readystatechange
|
3.4. 状態
client . readyState-
clientの状態を返します。
readyStateゲッターの手順は、次の表で
第1列のセルの値がthisの状態である行から第2列のセルの値を返すことです:
| 未送信 | UNSENT(数値0)
| オブジェクトが構築されました。 |
| オープン | OPENED(数値1)
| open()メソッドが正常に呼び出されました。この状態では、
setRequestHeader()を使用してリクエストヘッダーを設定したり、
send()メソッドを使用してフェッチを開始することができます。
|
| ヘッダー受信済み | HEADERS_RECEIVED
(数値2)
| 全てのリダイレクト(ある場合)が追跡され、レスポンスの全てのヘッダーが受信されました。 |
| 読み込み中 | LOADING(数値3)
| レスポンスの本文が受信されています。 |
| 完了 | DONE(数値4)
| データ転送が完了したか、転送中に何らかの問題(例:無限リダイレクト)が発生しました。 |
3.5. リクエスト
1 つ以上のイベントリスナーを
XMLHttpRequestUpload
オブジェクトに登録すると、CORS プリフライト要求 が発生する。(これは、
イベントリスナーを登録すると、アップロードリスナー が true に設定され、それによって
use-CORS-preflight フラグ が設定されるためである。)
3.5.1. open() メソッド
client . open(method, url [, async = true [, username = null [, password = null]]])-
要求 メソッド、要求 URL、および要求が 同期であるかどうかを設定する。
methodが有効なメソッドでない場合、またはurlを解析できない場合、 "
SyntaxError"DOMExceptionをスローします。methodが`
CONNECT`、`TRACE`、または`TRACK`に 大文字小文字を区別せず一致する場合、 "SecurityError"DOMExceptionをスローします。asyncがfalseで、現在のグローバルオブジェクトが
Windowオブジェクトであり、timeout属性が0でない、またはresponseType属性が空文字列でない場合、 "InvalidAccessError"DOMExceptionをスローします。
ワーカー外での同期的XMLHttpRequest
は、エンドユーザーの体験に悪影響を与えるため、ウェブプラットフォームから削除される過程にあります。(これは数年かかる長いプロセスです。)開発者は、
async引数にfalseを渡さないようにする必要があります。ユーザーエージェントはこのような使用法について開発者ツールで警告を出すことが強く推奨されており、
発生時に"InvalidAccessError"
DOMException
をスローする試みを行うことができます。
open(method, url)
および
open(method, url, async, username, password)
メソッドの手順は以下の通りです:
-
このthisの 関連するグローバルオブジェクトが
Windowオブジェクトであり、 関連付けられたDocumentが完全にアクティブでない場合、 以下をスローします: "InvalidStateError"DOMException。 -
methodがメソッド でない場合、 以下をスローします: "
SyntaxError"DOMException。 -
methodが禁止されたメソッド の場合、 以下をスローします: "
SecurityError"DOMException。 -
メソッドを正規化します。
-
parsedURLをURLをエンコード・解析した結果とし、 それをthis の関連設定オブジェクトに相対的なものとします。
-
parsedURLが失敗した場合、 以下をスローします: "
SyntaxError"DOMException。 -
async引数が省略された場合、asyncをtrueに設定し、 usernameとpasswordをnullに設定します。
残念ながら、レガシーコンテンツにより、async引数が
undefinedであることと省略されたことを同一視することが妨げられています。 -
parsedURLのホスト がnullでない場合:
-
asyncがfalseで、 現在のグローバルオブジェクトが
Windowオブジェクトであり、 thisのタイムアウトが0でない、またはthisのレスポンスタイプ が空文字列でない場合、 以下をスローします: "InvalidAccessError"DOMException。 -
このfetch controllerを終了します。 thisのfetch controller。
この時点でfetch が進行中である可能性があります。
-
オブジェクトに関連付けられた変数を次のように設定する:
-
this の
send()呼び出し済み を false に設定する。 -
this の アップロードリスナー を false に設定する。
上書き MIME 型 はここでは上書きされない。これは、
overrideMimeType()メソッドがopen()メソッドの前に呼び出せるためである。 -
-
-
イベントを発火する:
readystatechangeという名前のイベントを this に対して。
2つのopen()メソッドが定義されている理由は、
XMLHttpRequest現行標準を書く際に使用された編集ソフトウェアの制限によるものです。
3.5.2.
setRequestHeader() メソッド
client . setRequestHeader(name, value)-
既存の要求ヘッダーに値を追加するか、新しい要求ヘッダーを追加する。
状態 が オープン済み でない、または
send()呼び出し済み が true である場合、 "InvalidStateError"DOMExceptionを投げる。name がヘッダー名でない、または value がヘッダー値でない場合、"
SyntaxError"DOMExceptionを投げる。
setRequestHeader(name, value)
メソッド手順は次のとおり:
-
this の 状態 が オープン済み でない場合、"
InvalidStateError"DOMExceptionを投げる。 -
this の
send()呼び出し済み が true である場合、"InvalidStateError"DOMExceptionを投げる。 -
value を正規化する。
-
name がヘッダー名でない、または value が ヘッダー値でない場合、"
SyntaxError"DOMExceptionを投げる。空のバイト列は、空のヘッダー値を表す。
-
(name, value) が禁止要求ヘッダーである場合、返す。
同じヘッダーを2回設定した場合に何が起こるかを示す簡単なコード例:
// 以下のスクリプト:
var client = new XMLHttpRequest();
client. open( 'GET' , 'demo.cgi' );
client. setRequestHeader( 'X-Test' , 'one' );
client. setRequestHeader( 'X-Test' , 'two' );
client. send();
// …次のヘッダーが送信されます:
// X-Test: one, two
3.5.3.
timeout ゲッターおよびセッター
client . timeout-
ミリ秒単位の時間に設定できる。非 0 の値に設定すると、指定された時間が経過した後に fetching が終了される。時間が経過し、 要求がまだ完了しておらず、かつ 同期 が false である場合、
timeoutイベントが配送され、そうでない場合は "TimeoutError"DOMExceptionが投げられる(send()メソッドの場合)。設定時:同期 が true であり、かつ 現在のグローバルオブジェクト が
Windowオブジェクトである場合、"InvalidAccessError"DOMExceptionを投げる。
timeout getter 手順は、
this の タイムアウト を返すことである。
timeout
setter 手順は次のとおり:
-
現在のグローバルオブジェクト が
Windowオブジェクトであり、かつ this の 同期 が true である場合、"InvalidAccessError"DOMExceptionを投げる。
これは、
timeout
属性を
fetching が進行中である間にも
設定できることを意味する。その場合でも、
fetching の開始を基準として測定される。
3.5.4.
withCredentials ゲッターおよびセッター
client . withCredentials-
オリジン間要求に 資格情報を含める場合は true。オリジン間要求で資格情報を 除外し、その応答内の Cookie を無視する場合は false。 初期値は false。
設定時:状態 が 未送信 または オープン済み のいずれでもない、または
send()呼び出し済み が true である場合、 "InvalidStateError"DOMExceptionを投げる。
withCredentials getter 手順は、
this の オリジン間
資格情報 を返すことである。
withCredentials
setter 手順は次のとおり:
-
this の 状態 が 未送信 または オープン済み のいずれでもない場合、 "
InvalidStateError"DOMExceptionを投げる。 -
this の
send()呼び出し済み が true である場合、"InvalidStateError"DOMExceptionを投げる。
3.5.5. upload ゲッター
client . upload-
関連付けられた
XMLHttpRequestUploadオブジェクトを返す。これは、データがサーバーへ 転送されるときに送信情報を収集するために使用できる。
upload getter 手順は、
this の アップロードオブジェクト を返すことである。
3.5.6. send() メソッド
client . send([body = null])-
要求を開始する。body 引数は、存在する場合に 要求本体を提供し、 要求メソッドが
GETまたはHEADである場合は無視される。状態が オープン済み でない、または
send()呼び出し済みが true である場合、 "InvalidStateError"DOMExceptionを投げる。
send(body) メソッド
手順は次のとおり:
-
this の 状態 が オープン済み でない場合、"
InvalidStateError"DOMExceptionを投げる。 -
this の
send()呼び出し済み が true である場合、"InvalidStateError"DOMExceptionを投げる。 -
body が null でない場合:
-
extractedContentType を null とする。
-
body が
Documentである場合、 this の 要求本体を、 body を直列化し、 変換し、UTF-8 エンコードしたものに設定する。 -
そうでない場合:
-
originalAuthorContentType を、 取得する結果とする: `
Content-Type` を、this の 作者要求ヘッダーから取得する。 -
originalAuthorContentType が非 null である場合:
-
body が
Documentオブジェクト、URLSearchParamsオブジェクト、または 文字列である場合:-
contentTypeRecord を、 originalAuthorContentType を解析した結果とする。
-
contentTypeRecord が failure でなく、 contentTypeRecord の parameters["
charset"] が存在し、かつ parameters["charset"] が "UTF-8" に対する ASCII 大小無視一致でない場合:
-
-
-
そうでない場合:
-
-
1 つ以上のイベントリスナーが this の アップロードオブジェクトに登録されている場合、 this の アップロードリスナーを true に設定する。
-
req を、次のように初期化された新しい 要求とする:
- method
- This の 要求メソッド。
- URL
- This の 要求 URL。
- ヘッダーリスト
- This の 作者要求ヘッダー。
- unsafe-request フラグ
- 設定済み。
- body
- This の 要求本体。
- client
- This の 関連設定オブジェクト。
- mode
- "
cors"。 - use-CORS-preflight フラグ
- this の アップロードリスナーが true である場合に設定済み。
- credentials mode
- this
の オリジン間資格情報が true である場合は
"
include"、 そうでない場合は "same-origin"。 - use-URL-credentials フラグ
- this の 要求 URLが資格情報を含む場合に設定済み。
- initiator type
- "
xmlhttprequest"。
-
this の
send()呼び出し済みを true に設定する。 -
-
進捗イベントを発火する:
loadstartという名前のイベントを this に対して、0 および 0 で。 -
requestBodyTransmitted を 0 とする。
-
requestBodyLength を、req の bodyが非 null である場合は、その 長さとし、 そうでない場合は 0 とする。
-
アサート:requestBodyLength は整数である。
-
this の アップロード完了が false であり、かつ this の アップロードリスナーが true である場合、進捗イベントを発火する:
loadstartという名前のイベントを this の アップロードオブジェクト に対して、 requestBodyTransmitted および requestBodyLength で。 -
this の 状態が オープン済み でない、または this の
send()呼び出し済みが false である場合、返す。 -
bytesLength が与えられた processRequestBodyChunkLength を、次の手順とする:
-
requestBodyTransmitted を bytesLength だけ増加させる。
-
これらの手順が前回呼び出されてからおおよそ 50ms が経過していない場合、返す。
-
this の アップロード リスナーが true である場合、進捗イベントを発火する:
progressという名前のイベントを this の アップロードオブジェクトに対して、 requestBodyTransmitted および requestBodyLength で。
これらの手順は、新しいバイトが送信されたときにのみ呼び出される。
-
-
processRequestEndOfBody を次の手順とする:
-
this の アップロード リスナーが false である場合、返す。
-
進捗イベントを発火する:
progressという名前のイベントを this の アップロード オブジェクトに対して、requestBodyTransmitted および requestBodyLength で。 -
進捗イベントを発火する:
loadという名前のイベントを this の アップロード オブジェクトに対して、requestBodyTransmitted および requestBodyLength で。 -
進捗イベントを発火する:
loadendという名前のイベントを this の アップロード オブジェクトに対して、requestBodyTransmitted および requestBodyLength で。
-
response が与えられた processResponse を、次の手順とする:
-
イベントを発火する:
readystatechangeという名前のイベントを this に対して。 -
this の 応答の bodyが null である場合、 応答の本体終了を処理するを this について実行し、返す。
-
length が整数でない場合、それを 0 に設定する。
-
bytes が与えられた processBodyChunk を次の手順とする:
-
これらの手順が前回呼び出されてからおおよそ 50ms が経過していない場合、 返す。
-
イベントを発火する:
readystatechangeという名前のイベントを this に対して。Web 互換性が、
readystatechangeが this の 状態の変更より頻繁に発火する理由である。 -
進捗イベントを発火する:
progressという名前のイベントを this に対して、this の 受信済みバイトの 長さおよび length で。
-
processEndOfBody を次の手順とする:応答の本体終了を処理するを this について実行する。
-
processBodyError を次の手順とする:
-
this の 応答の bodyを、processBodyChunk、 processEndOfBody、 processBodyError、および this の 関連グローバルオブジェクトを与えて、増分的に読み取る。
-
this の fetch コントローラーを、 req をfetchingした結果に設定する。このとき、 processRequestBodyChunkLength は processRequestBodyChunkLength に設定し、processRequestEndOfBody は processRequestEndOfBody に設定し、かつ processResponse は processResponse に設定する。
-
now を現在時刻とする。
-
次の手順を並列に実行する:
-
-
-
processedResponse を false とする。
-
response および nullOrFailureOrBytes が与えられた processResponseConsumeBody を、次の手順とする:
-
this の fetch コントローラーを、 req をfetchingした結果に設定する。このとき、 processResponseConsumeBody は processResponseConsumeBody に設定し、 かつ useParallelQueue は true に設定する。
-
now を現在時刻とする。
-
processedResponse が true になるまで、または this の タイムアウトが 0 でなく、かつ now から this の タイムアウトミリ秒が経過するまで、一時停止する。
-
processedResponse が false である場合、this の タイムアウト済み を true に設定し、 this の fetch コントローラーを終了する。
-
現在のグローバルオブジェクトを与えて、タイミングを報告する: this の fetch コントローラーについて。
-
応答の本体終了を処理するを this について実行する。
-
XMLHttpRequest
オブジェクト xhr について、応答の本体終了を処理するには、次の手順を実行する:
-
エラーを処理する: xhr について。
-
length が整数でない場合、それを 0 に設定する。
-
xhr の 同期が false である場合、進捗 イベントを発火する:
progressという名前のイベントを xhr に対して、 transmitted および length で。 -
xhr の 状態を 完了に設定する。
-
xhr の
send()呼び出し済みを false に設定する。 -
イベントを発火する:
readystatechangeという名前のイベントを xhr に対して。 -
進捗イベントを発火する:
loadという名前のイベントを xhr に対して、transmitted および length で。 -
進捗イベントを発火する:
loadendという名前のイベントを xhr に対して、 transmitted および length で。
XMLHttpRequest
オブジェクト xhr について、エラーを処理するには、次の手順を実行する:
-
xhr の
send()呼び出し済みが false である場合、返す。 -
xhr の タイムアウト 済みが true である場合、xhr、
timeout、および "TimeoutError"DOMExceptionについて、要求エラー手順を実行する。 -
そうでなく、xhr の 応答の 中止済みフラグが設定されている場合、xhr、
abort、および "AbortError"DOMExceptionについて、要求エラー手順を実行する。 -
そうでなく、xhr の 応答が ネットワークエラーである場合、xhr、
error、 および "NetworkError"DOMExceptionについて、要求エラー手順を実行する。
XMLHttpRequest
オブジェクト xhr、
event、および任意で exception についての 要求エラー
手順は次のとおり:
-
xhr の 状態を 完了に設定する。
-
xhr の
send()呼び出し済みを false に設定する。 -
イベントを発火する:
readystatechangeという名前のイベントを xhr に対して。この時点で、xhr の 同期が false であることは明らかである。
-
xhr の アップロード完了が false である場合:
-
xhr の アップロード完了を true に設定する。
-
xhr の アップロードリスナーが true である場合:
-
進捗イベントを発火する: event という名前のイベントを xhr の アップロード オブジェクトに対して、0 および 0 で。
-
進捗イベントを発火する:
loadendという名前のイベントを xhr の アップロード オブジェクトに対して、0 および 0 で。
-
-
-
進捗イベントを発火する:event という名前のイベントを xhr に対して、0 および 0 で。
-
進捗イベントを発火する:
loadendという名前のイベントを xhr に対して、0 および 0 で。
3.5.7. abort() メソッド
client . abort()- すべてのネットワーク活動を取り消す。
abort() メソッド手順は次のとおり:
-
中止する:this の fetch コントローラーを。
-
this の 状態が、this の
send()呼び出し済み が true である オープン済み、ヘッダー受信済み、または 読み込み中 である場合、 要求エラー 手順を this およびabortについて実行する。 -
this の 状態が 完了 である場合、this の 状態を 未送信 に設定し、this の 応答を ネットワークエラーに設定する。
readystatechangeイベントは配送されない。
3.6. レスポンス
3.6.1.
responseURL ゲッター
responseURL getter 手順は、
this の 応答の URL が
null である場合は空文字列を返し、そうでない場合は exclude fragment flag を
設定した、その 直列化を返すことである。
3.6.2. status ゲッター
status ゲッターの手順は次の通りです:
thisの
レスポンスの
ステータスを返します。
3.6.3.
statusText ゲッター
statusText ゲッターの手順は次の通りです:
thisの
レスポンスの
ステータスメッセージを返します。
3.6.4.
getResponseHeader() メソッド
getResponseHeader(name)
メソッドの手順は次の通りです:
取得したnameの結果を返します。
対象はthisの
レスポンスの
ヘッダーリスト。
Fetch 現行標準はthisの レスポンスの ヘッダーリストをフィルタリングします。 [FETCH]
次のスクリプトの場合:
var client = new XMLHttpRequest();
client. open( "GET" , "unicorns-are-awesome.txt" , true );
client. send();
client. onreadystatechange = function () {
if ( this . readyState == this . HEADERS_RECEIVED) {
print( client. getResponseHeader( "Content-Type" ));
}
}
print()関数は次のような内容を処理します:
text/plain; charset=UTF-8
3.6.5. getAllResponseHeaders()
メソッド
バイト列 a は、次の手順が true を返す場合、レガシー大文字バイト未満の バイト列 bです:
getAllResponseHeaders() メソッドの手順は次の通りです:
-
output を空のバイト列として設定します。
-
initialHeaders を、次のソートおよび結合の結果として設定します。 対象はthisの レスポンスの ヘッダーリスト。
-
headers を、昇順にソートした initialHeaders の結果として設定します。 このとき、a が b より小さい場合、 a の名前が レガシー大文字バイト未満であるとします。
残念ながら、これは展開済みのコンテンツとの互換性のために必要です。
-
各 header について、 header の名前に続けて 0x3A 0x20 バイトペアを追加し、 header の値に続けて 0x0D 0x0A バイトペアを追加し、 output に追加します。
-
output を返します。
Fetch 現行標準はthisの レスポンスの ヘッダーリストをフィルタリングします。 [FETCH]
次のスクリプトの場合:
var client = new XMLHttpRequest();
client. open( "GET" , "narwhals-too.txt" , true );
client. send();
client. onreadystatechange = function () {
if ( this . readyState == this . HEADERS_RECEIVED) {
print( this . getAllResponseHeaders());
}
}
print()関数は次のような内容を処理します:
connection: Keep-Alive
content-type: text/plain; charset=utf-8
date: Sun, 24 Oct 2004 04:58:38 GMT
keep-alive: timeout=15, max=99
server: Apache/1.3.31 (Unix)
transfer-encoding: chunked
3.6.6. レスポンス本文
XMLHttpRequest
オブジェクト xhr に対して レスポンス MIME タイプを取得
するには、次の手順を実行します:
-
mimeType を、xhr の レスポンス の ヘッダーリストから MIME タイプを抽出した結果として設定します。
-
もし mimeType が失敗の場合、mimeType を
text/xmlに設定します。 -
mimeType を返します。
XMLHttpRequest
オブジェクト xhr に対して 最終的な MIME タイプを取得
するには、次の手順を実行します:
-
もし xhr の override MIME タイプ が null の場合、 xhr に対して レスポンス MIME タイプを取得 の結果を返します。
-
xhr の override MIME タイプ を返します。
XMLHttpRequest
オブジェクト xhr に対して 最終的なエンコーディングを取得
するには、次の手順を実行します:
-
label を null に設定します。
-
responseMIME を xhr に対して レスポンス MIME タイプを取得した結果として設定します。
-
もし responseMIME の パラメーター["
charset"] が存在する場合、label をそれに設定します。 -
もし xhr の override MIME タイプ の パラメーター["
charset"] が存在する場合、label をそれに設定します。 -
もし label が null の場合、null を返します。
-
encoding を label から エンコーディングを取得した結果として設定します。
-
もし encoding が失敗の場合、null を返します。
-
encoding を返します。
上記の手順は、最終的な MIME タイプを取得 を使用しないように意図的に設計されています。これはウェブ互換性のためです。
ドキュメントレスポンスを設定するためには、XMLHttpRequest
オブジェクト
xhr に対して、次の手順を実行します。
-
finalMIME を、xhr に対して 最終的な MIME タイプを取得する 結果とします。
-
finalMIME が HTML MIME タイプ または XML MIME タイプ でない場合は、処理を終了します。
-
xhr の response type が空文字列であり、かつ finalMIME が HTML MIME タイプ である場合は、処理を終了します。
これは、レガシーコンテンツの破壊を防ぐために、xhr の response type が "
document" に限定されています。 -
finalMIME が HTML MIME タイプ である場合:
-
charset を、xhr に対する 最終的なエンコーディングを取得する 結果とします。
-
charset が null の場合は、 バイトストリームの最初の1024バイトを事前スキャン し、それが失敗しなければ charset をその戻り値に設定します。
-
charset が null の場合は、charset を UTF-8 に設定します。
-
document を、xhr の 受信バイト を HTML Standard の HTML パーサーの規則に従い、 スクリプトを無効にした状態で、既知の確定エンコーディング charset を用いて解析した結果を表す ドキュメント とします。 [HTML]
-
document を HTML ドキュメント としてフラグ付けします。
-
-
そうでない場合、document を xhr の 受信バイト に対して、XML パーサー を XML スクリプトサポートを無効にした状態で 実行した結果を表す ドキュメント とします。それが失敗(未対応の文字エンコーディング、名前空間の整形式エラーなど)した場合、null を返します。 [HTML]
参照されるリソースは読み込まれず、関連する XSLT は適用されません。
-
charset が null の場合は、charset を UTF-8 に設定します。
-
document の エンコーディング を charset に設定します。
-
document の コンテンツタイプ を finalMIME に設定します。
-
document の オリジン を xhr の 関連する設定オブジェクト の オリジン に設定します。
-
xhr の response object を document に設定します。
テキストレスポンスを取得するためには、
XMLHttpRequest
オブジェクト xhr に対して、次の手順を実行します。
-
charset を、xhr に対する 最終的なエンコーディングを取得する 結果とします。
-
xhr の response type が空文字列であり、charset が null であり、 かつ xhr に対して 最終的な MIME タイプを取得する 結果が XML MIME タイプ である場合は、 XML 仕様に記載された規則を使用してエンコーディングを決定します。charset をその決定されたエンコーディングとします。 [XML] [XML-NAMES]
これは、非レガシーな response type 値 "
text" を簡潔に保つために、 xhr の response type を空文字列に限定しています。 -
charset が null の場合は、charset を UTF-8 に設定します。
-
xhr の 受信バイト を デコード し、 フォールバックエンコーディングを charset として、その結果を返します。
作成者は、常にリソースを UTF-8 を使用してエンコードすることを強く推奨します。
3.6.7.
overrideMimeType() メソッド
client . overrideMimeType(mime)-
レスポンスの `
Content-Type` ヘッダー値が mime であるかのように振る舞います。(ヘッダー自体は変更されません。)loading または done 状態のときに、"
InvalidStateError"DOMExceptionをスローします。
overrideMimeType(mime)
メソッドの手順は以下の通りです:
-
this の 状態が 読み込み中 または 完了 である場合、"
InvalidStateError"DOMExceptionを投げる。 -
this の 上書き MIME 型を、 mime を解析した結果に設定する。
-
this の 上書き MIME 型が failure である場合、this の 上書き MIME 型を
application/octet-streamに設定する。
3.6.8.
responseType ゲッターおよびセッター
client . responseType [ = value ]-
応答型を返す。
応答型を変更するために設定できる。値は次のとおり: 空文字列(既定)、 "
arraybuffer"、 "blob"、 "document"、 "json"、および "text"。設定時:現在のグローバルオブジェクトが
Windowオブジェクトでない場合、"document" への設定は無視される。設定時:状態が 読み込み中 または 完了 である場合、"
InvalidStateError"DOMExceptionを投げる。設定時: 同期が true であり、かつ 現在のグローバルオブジェクトが
Windowオブジェクトである場合、"InvalidAccessError"DOMExceptionを投げる。
responseType getter 手順は、
this の 応答型を返すことである。
responseType
setter 手順は次のとおり:
-
現在のグローバルオブジェクトが
Windowオブジェクトでなく、かつ指定された値が "document" である場合、返す。 -
this の 状態が 読み込み中 または 完了 である場合、"
InvalidStateError"DOMExceptionを投げる。 -
現在のグローバルオブジェクトが
Windowオブジェクトであり、かつ this の 同期が true である場合、"InvalidAccessError"DOMExceptionを投げる。
3.6.9.
response ゲッター
client . response-
レスポンスボディを返します。
response ゲッターの手順は以下の通りです:
-
this の 応答型が空文字列または "
text" である場合:-
this についてテキスト応答を取得する結果を返す。
-
this の 応答型が "
arraybuffer" である場合、this の 応答オブジェクトを、 this の 受信済みバイトを表す 新しいArrayBufferオブジェクトに設定する。これが例外を投げる場合、this の 応答オブジェクト を failure に設定し、null を返す。ArrayBufferオブジェクトの割り当ては、成功することが保証されていない。 [ECMASCRIPT] -
そうでなく、this の 応答型が "
blob" である場合、 this の 応答オブジェクトを、 this の 受信済みバイトを表し、typeが this について 最終 MIME 型を取得する結果に設定された、新しいBlobオブジェクトに設定する。 -
そうでなく、this の 応答型が "
document" である場合、 文書 応答を設定するを this について行う。 -
そうでない場合:
3.6.10.
responseText ゲッター
client . responseText-
レスポンスをテキストとして返します。
InvalidStateError"DOMExceptionをスローします。responseTypeが空文字列または "text" でない場合。
responseText ゲッターの手順は以下の通りです:
-
this の 応答型が空文字列でも "
text" でもない場合、 "InvalidStateError"DOMExceptionを投げる。 -
this についてテキスト応答を取得する結果を返す。
3.6.11.
responseXML ゲッター
client . responseXML-
レスポンスをドキュメントとして返します。
InvalidStateError"DOMExceptionをスローします。responseTypeが空文字列または "document" でない場合。
responseXML ゲッターの手順は以下の通りです:
-
this の 応答型が空文字列でも "
document" でもない場合、 "InvalidStateError"DOMExceptionを投げる。 -
文書 応答を設定するを this について行う。
3.7. イベント概要
このセクションは規範的ではありません。
次のイベントが XMLHttpRequest
または XMLHttpRequestUpload
オブジェクト上でディスパッチされます:
| イベント名 | インターフェース | ディスパッチされるタイミング… |
|---|---|---|
readystatechange
| Event
| readyState
属性が値を変更したとき。ただし、UNSENT に変更される場合を除く。
|
loadstart
| ProgressEvent
| フェッチが開始されたとき。 |
progress
| ProgressEvent
| データを送信中。 |
abort
| ProgressEvent
| フェッチが中止されたとき。例えば、abort()
メソッドを呼び出した場合。
|
error
| ProgressEvent
| フェッチが失敗したとき。 |
load
| ProgressEvent
| フェッチが成功したとき。 |
timeout
| ProgressEvent
| フェッチが完了する前に、著者が指定したタイムアウトが経過したとき。 |
loadend
| ProgressEvent
| フェッチが完了したとき(成功または失敗)。 |
4. インターフェース FormData
typedef (File or USVString ); [FormDataEntryValue Exposed =(Window ,Worker )]interface {FormData constructor (optional HTMLFormElement ,form optional HTMLElement ?=submitter null );undefined append (USVString ,name USVString );value undefined append (USVString ,name Blob ,blobValue optional USVString );filename undefined delete (USVString );name FormDataEntryValue ?get (USVString );name sequence <FormDataEntryValue >getAll (USVString );name boolean has (USVString );name undefined set (USVString ,name USVString );value undefined set (USVString ,name Blob ,blobValue optional USVString );filename iterable <USVString ,FormDataEntryValue >; };
各FormData
オブジェクトには関連付けられた
エントリリスト(
エントリリスト)が存在します。それは初期状態では空です。
このセクションでは以前、 エントリ、エントリの 名前および 値、そして エントリを作成するアルゴリズムを定義していました。これらの定義は HTML標準に移動されました。[HTML]
new FormData(form, submitter)
コンストラクタの手順は以下の通りです:
-
formが指定された場合、以下を実行します:
-
submitterがnullではない場合、以下を実行します:
-
submitterのフォーム所有者がformでない場合、例外をスローします。 "
NotFoundError"DOMException。
-
listを、エントリリストを構築する結果として formとsubmitterを用いて取得します。
-
listがnullの場合、例外をスローします。 "
InvalidStateError"DOMException。
-
append(name, value)
メソッドと
append(name, blobValue, filename)
メソッドの手順は以下の通りです:
-
valueを、指定された場合はvalue、それ以外の場合はblobValueとします。
-
entryをエントリを作成するの結果として name、value、および指定された場合はfilenameを用いて取得します。
valueおよびblobValueという名前の引数がある理由は、 XMLHttpRequest標準を作成するために使用された編集ソフトウェアの制限によるものです。
The delete(name)
メソッド手順は、削除することである:エントリーのうち、その
名前が name であるものすべてを、this の
エントリー
リストから削除する。
The get(name) メソッド
手順は次のとおり:
The getAll(name)
メソッド手順は次のとおり:
-
エントリーのうち、その名前が name であるものが、this の エントリーリスト内に存在しない場合、空のリストを返す。
-
値を返す:すべての エントリーのうち、その 名前が name であるものの値を、順に、this の エントリーリストから返す。
The has(name) メソッド
手順は、エントリーのうち、その
名前が name であるものが、this の
エントリー
リスト内に存在する場合は true を返し、そうでない場合は false を返すことである。
The
set(name, value)
および
set(name, blobValue, filename)
メソッド手順は次のとおり:
-
value を、与えられている場合は value、そうでない場合は blobValue とする。
-
entry を、 name、value、および与えられている場合は filename を用いてエントリーを作成する結果とする。
-
エントリーのうち、その名前が name であるものが、this の エントリーリスト 内に存在する場合、そのような最初の エントリーを entry で置換し、その他を削除する。
value という名前の引数と blobValue が存在する理由は、XMLHttpRequest Standard を記述するために使用されている編集ソフトウェアの制限によるものである。
反復処理する値ペアは、this の エントリーリストの エントリーであり、キーは名前、 値は値である。
5. インターフェース ProgressEvent
[Exposed =(Window ,Worker )]interface :ProgressEvent Event {(constructor DOMString ,type optional ProgressEventInit = {});eventInitDict readonly attribute boolean lengthComputable ;readonly attribute double loaded ;readonly attribute double total ; };dictionary :ProgressEventInit EventInit {boolean =lengthComputable false ;double = 0;loaded double = 0; };total
イベント
にProgressEvent
インターフェースを使用して、進行状況を示します。
lengthComputable、
loaded、
および
total
のゲッターステップは、それらが初期化された値を返すことです。
5.1. ProgressEvent
インターフェースを使用してイベントを発火する
進行イベントを発火するには、
eという名前のイベントをtargetで発火することを意味します。transmittedと
lengthを指定して、ProgressEventを使用し、
loaded
属性をtransmittedに初期化し、lengthが0でない場合、
lengthComputable
属性をtrueに初期化し、
total
属性をlengthに初期化します。
5.2. ProgressEvent
インターフェースを使用するイベントの推奨される名前
このセクションは非規範的です。
イベント
にProgressEvent
インターフェースを使用する場合の推奨されるtype
属性値は以下の表にまとめられています。
仕様の編集者は、具体的なシナリオに合わせて詳細を調整する自由がありますが、
この分野に詳しい人々からの意見を得るため、WHATWGコミュニティと議論することを強く推奨します。
type
属性値
| 説明 | 回数 | タイミング |
|---|---|---|---|
loadstart
| 進行が開始された。 | 1回。 | 最初に。 |
progress
| 進行中。 | 1回以上。 | loadstartが
ディスパッチされた後。
|
error
| 進行に失敗した。 | 0回または1回(相互排他)。 | progressの最後が
ディスパッチされた後。
|
abort
| 進行が終了された。 | ||
timeout
| 設定された時間切れにより進行が終了した。 | ||
load
| 進行が成功した。 | ||
loadend
| 進行が停止した。 | 1回。 | error、abort、
timeout、またはloadが
ディスパッチされた後。
|
error、abort、timeout、
およびloadイベントタイプは相互排他です。
ウェブプラットフォーム全体でerror、abort、
timeout、およびloadイベントタイプは、
bubbles
およびcancelable
属性をfalseに初期化しているため、一貫性を保つために、
イベント
にProgressEvent
インターフェースを使用する場合も同様にすることを推奨します。
5.3. セキュリティの考慮事項
オリジン間リクエストでは、例えばFetch標準で定義されている
CORSプロトコル
のようなオプトインが使用されなければなりません。
それにより、イベントが
ProgressEvent
インターフェースを使用して
ディスパッチ
される際に、通常は得られない情報(例: サイズ)が明らかになる可能性があるためです。 [FETCH]
5.4. 例
この例では、XMLHttpRequest
と以前のセクションで定義された概念、
さらにHTMLの
progress
要素を組み合わせて使用し、リソースを
フェッチ
するプロセスを表示します。
<!DOCTYPE html>
< title > マジカルユニコーンを待っています</ title >
< progress id = p ></ progress >
< script >
var progressBar = document. getElementById( "p" ),
client = new XMLHttpRequest()
client. open( "GET" , "magical-unicorns" )
client. onprogress = function ( pe) {
if ( pe. lengthComputable) {
progressBar. max = pe. total
progressBar. value = pe. loaded
}
}
client. onloadend = function ( pe) {
progressBar. value = pe. loaded
}
client. send()
</ script >
完全な動作コードは、もちろんより詳細で、ネットワークエラーやエンドユーザーによるリクエストの終了など、さらに多くのシナリオに対応する必要があります。
謝辞
次の方々に感謝します: Addison Phillips、 Adrian Bateman、 Ahmed Kamel、 Alan Thomas、 Alex Hopmann、 Alex Vincent、 Alexey Proskuryakov、 Ali Alabbas、 Andrea Marchesini、 Asbjørn Ulsberg、 Bertrand Guay-Paquet、 Björn Höhrmann、 Boris Zbarsky、 Caitlin Potter、 Cameron McCormack、 白丞祐 (Cheng-You Bai)、 Chris Marrin、 Christophe Jolif、 Charles McCathieNevile、 Chirag S Kumar、 Dan Winship、 David Andersson、 David Flanagan、 David Håsäther、 David Levin、 Dean Jackson、 Denis Sureau、 Domenic Denicola、 Dominik Röttsches、 Doug Schepers、 Douglas Livingstone、 Elliott Sprehn、 Elliotte Harold、 Eric Lawrence、 Eric Uhrhane、 Erik Arvidsson、 Erik Dahlström、 Feras Moussa、 Gideon Cohn、 Glenn Adams、 Gorm Haug Eriksen、 Gregory Terzian、 Håkon Wium Lie、 Hallvord R. M. Steen、 Henri Sivonen、 Hiroshige Hayashizaki、 Huub Schaeks、 Ian Clelland、 Ian Davis、 Ian Hickson、 Ivan Herman、 Jake Archibald、 Jared Jacobs、 Jarred Nicholls、 Jeff Walden、 Jens Lindström、 Jim Deegan、 Jim Ley、 Joe Farro、 Jonas Sicking、 Julian Reschke、 송정기 (Jungkee Song)、 呂康豪 (Kang-Hao Lu)、 Karl Dubost、 Keith Yeung、 田村健人 (Kent TAMURA)、 Lachlan Hunt、 Maciej Stachowiak、 Magnus Kristiansen、 Manish Goregaokar、 Marc Hadley、 Marcos Caceres、 Mark Baker、 Mark Birbeck、 Mark Nottingham、 Mark S. Miller、 Martin Hassman、 Mike Pennisi、 Mohamed Zergaoui、 Ms2ger、 Noam Rosenthal、 Odin Hørthe Omdal、 Olli Pettay、 Pawel Glowacki、 Peter Michaux、 Philip Jägenstedt、 Philip Taylor、 Rashika Jaggi、 Robin Berjon、 Rune F. Halvorsen、 Ruud Steltenpool、 Ryo Onodera、 Sam Sneddon、 Sergiu Dumitriu、 Shivakumar Jagalur Matt、 Sigbjørn Finne、 Simon Pieters、 Stewart Brodie、 Sunava Dutta、 Takeshi Kurosawa、 Takeshi Yoshino、 Thomas Roessler、 Thomas Wisniewski、 Tom Magliery、 Travis Leithead、 triple-underscore、 Yaron Tausky、 Yehuda Katz、 Youenn Fablet、 そしてZhenbin Xu。 この標準への貢献に感謝します。
特に、最初にXMLHttpRequest
インターフェースを実装したMicrosoftの社員の皆様に感謝します。このインターフェースは最初にWindows Internet Explorerブラウザで広く展開されました。
Ian Hickson氏に特に感謝します。同氏がHTML標準(当時はWeb Applications 1.0)でこの仕様の初期バージョンを起草しました。[HTML]
W3C SVG WGに特に感謝します。同グループがProgressEvent
クラスをSVG Micro DOMの一部として初めて起草しました。SVG Micro DOMを参照。
この標準は、 Anne van Kesteren氏(Apple、 annevk@annevk.nl)によって執筆されました。
知的財産権
Copyright © WHATWG (Apple, Google, Mozilla, Microsoft)。この作品はCreative Commons Attribution 4.0 International Licenseの下でライセンスされています。この中の一部がソースコードに取り込まれている場合、その部分はBSD 3-Clause Licenseの下でライセンスされます。
これは現行標準です。特許審査バージョンに興味がある方は現行標準レビュードラフトをご覧ください。