статический метод request
Создаёт и отправляет запрос URL для указанного url.
По умолчанию request выполняет HTTP-запрос GET, но можно использовать другой метод (POST, PUT, DELETE и т. д.), указав параметр method. (См. также HttpRequest.postFormData, предназначенный только для запросов POST.
Future завершается, когда ответ становится доступен.
Если указан параметр sendData, вместе с HttpRequest будут отправлены данные в формате ByteBuffer, Blob, Document, String или FormData.
Если указан параметр responseType, он задаёт желаемый формат ответа на запрос. По умолчанию используется String, но также можно указать 'arraybuffer', 'blob', 'document', 'json' или 'text'. Дополнительные сведения см. в описании HttpRequest.responseType.
Параметр withCredentials указывает, следует ли включать в запрос такие учётные данные, как cookie, уже заданная в заголовке, или заголовки авторизации. При использовании учётных данных следует учитывать следующее:
- Учётные данные нужны только для запросов между разными источниками.
- Заголовок
Access-Control-Allow-Originдляurlне может содержать подстановочный символ (*). - Для
urlдолжно быть установлено значение true в заголовкеAccess-Control-Allow-Credentials. - Если для
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.19.6/dart-html/HttpRequest/request.html