Метод request
Создаёт и отправляет запрос к указанному url.
По умолчанию request выполнит запрос HTTP GET, но можно использовать другой метод (POST, PUT, DELETE, и т. д.) указав параметр method. (См. также HttpRequest.postFormData для запросов POST только).
Future завершается, когда ответ доступен.
Если указано, sendData отправит данные в виде ByteBuffer, Blob, Document, String или FormData вместе с HttpRequest.
Если указано, responseType устанавливает желаемый формат ответа для запроса. По умолчанию это String, но также может быть 'arraybuffer', 'blob', 'document', 'json' или 'text'. См. также HttpRequest.responseType для получения дополнительной информации.
Параметр withCredentials указывает, что для запроса должны быть указаны аутентификационные данные, такие как cookie (уже) заданные в заголовке или заголовки авторизации. Важные моменты при использовании аутентификационных данных:
- Использование аутентификационных данных полезно только для запросов к другим доменам.
- Заголовок
Access-Control-Allow-Originurlне может содержать символ подстановки (*). - Заголовок
Access-Control-Allow-Credentialsurlдолжен быть установлен в значение true. - Если
Access-Control-Expose-Headersне установлен в значение true, при вызове getAllResponseHeaders будет возвращена только подмножество всех заголовков ответа.
Следующее эквивалентно приведённому выше примеру getString:
var name = Uri.encodeQueryComponent('John');
var id = Uri.encodeQueryComponent('42');
HttpRequest.request('users.json?name=$name&id=$id')
.then((HttpRequest resp) {
// Do something with the response.
}); Вот пример отправки всей формы с помощью FormData.
var myForm = querySelector('form#myForm');
var data = new FormData(myForm);
HttpRequest.request('/submit', method: 'POST', sendData: data)
.then((HttpRequest resp) {
// Do something with the response.
}); Обратите внимание, что запросы к URI file:// поддерживаются только расширениями Chrome с соответствующими разрешениями в манифесте. Запросы к URI file:// также никогда не завершатся ошибкой — Future всегда завершится успешно, даже если файл не найден.
См. также: заголовки авторизации.
Реализация
static Future<HttpRequest> request(String url,
{String? method,
bool? withCredentials,
String? responseType,
String? mimeType,
Map<String, String>? requestHeaders,
sendData,
void onProgress(ProgressEvent e)?}) {
var completer = new Completer<HttpRequest>();
var xhr = new HttpRequest();
if (method == null) {
method = 'GET';
}
xhr.open(method, url, async: true);
if (withCredentials != null) {
xhr.withCredentials = withCredentials;
}
if (responseType != null) {
xhr.responseType = responseType;
}
if (mimeType != null) {
xhr.overrideMimeType(mimeType);
}
if (requestHeaders != null) {
requestHeaders.forEach((header, value) {
xhr.setRequestHeader(header, value);
});
}
if (onProgress != null) {
xhr.onProgress.listen(onProgress);
}
xhr.onLoad.listen((e) {
var status = xhr.status!;
var accepted = status >= 200 && status < 300;
var fileUri = status == 0; // file:// URIs have status of 0.
var notModified = status == 304;
// Redirect status is specified up to 307, but others have been used in
// practice. Notably Google Drive uses 308 Resume Incomplete for
// resumable uploads, and it's also been used as a redirect. The
// redirect case will be handled by the browser before it gets to us,
// so if we see it we should pass it through to the user.
var unknownRedirect = status > 307 && status < 400;
if (accepted || fileUri || notModified || unknownRedirect) {
completer.complete(xhr);
} else {
completer.completeError(e);
}
});
xhr.onError.listen(completer.completeError);
if (sendData != null) {
xhr.send(sendData);
} else {
xhr.send();
}
return completer.future;
}
© 2012 the Dart project authors
Licensed under the BSD 3-Clause "New" or "Revised" License.
https://api.dart.dev/stable/2.18.5/dart-html/HttpRequest/request.html