Улучшить эту документацию Просмотреть исходный код $http
- $httpProvider
- Сервис в модуле ng
Сервис $http — это основной Angular-сервис, который обеспечивает взаимодействие с удалёнными HTTP-серверами через объект XMLHttpRequest браузера или через JSONP.
Для тестирования приложений, использующих сервис $http, см. $httpBackend mock.
Для более высокого уровня абстракции обратитесь к сервису $resource.
API $http основан на API отложенных задач/обещаний ($q), которые предоставляет сервис $q. Хотя для простых сценариев использования это не очень важно, для расширенных сценариев важно ознакомиться с этими API и гарантиями, которые они предоставляют.
Общее использование
Сервис $http — это функция, которая принимает один аргумент — объект конфигурации — используемый для генерации HTTP-запроса и возвращает обещание с двумя специфичными для $http методами: success и error.
$http({method: 'GET', url: '/someUrl'}).
success(function(data, status, headers, config) {
// this callback will be called asynchronously
// when the response is available
}).
error(function(data, status, headers, config) {
// called asynchronously if an error occurs
// or server returns response with an error status.
});
Поскольку возвращаемое значение вызова функции $http является promise, вы также можете использовать метод then для регистрации обратных вызовов, и эти обратные вызовы будут получать один аргумент — объект, представляющий ответ. Более подробную информацию см. в сигнатуре API и информации о типах ниже.
Код состояния ответа между 200 и 299 считается кодом состояния успеха и приведёт к вызову обратного вызова успеха. Обратите внимание, что если ответ представляет собой перенаправление, XMLHttpRequest будет прозрачно следовать за ним, что означает, что обратный вызов ошибки не будет вызван для таких ответов.
Написание юнит-тестов, использующих $http
При тестировании (используя ngMock) необходимо вызвать $httpBackend.flush(), чтобы очистить каждый ожидающий запрос, используя обученные ответы.
$httpBackend.expectGET(...); $http.get(...); $httpBackend.flush();
Методы-короткоходы
Также доступны методы-короткоходы. Все методы-короткоходы требуют указания URL, а данные запроса должны быть переданы для запросов POST/PUT.
$http.get('/someUrl').success(successCallback);
$http.post('/someUrl', data).success(successCallback);
Полный список методов-короткоходов:
Установка HTTP-заголовков
Сервис $http автоматически добавляет определённые HTTP-заголовки ко всем запросам. Эти значения по умолчанию можно полностью настроить, обратившись к объекту конфигурации $httpProvider.defaults.headers, который в настоящее время содержит эту конфигурацию по умолчанию:
-
$httpProvider.defaults.headers.common(заголовки, общие для всех запросов):Accept: application/json, text/plain, * / *
-
$httpProvider.defaults.headers.post: (заголовки по умолчанию для запросов POST)Content-Type: application/json
-
$httpProvider.defaults.headers.put(заголовки по умолчанию для запросов PUT)Content-Type: application/json
Чтобы добавить или перезаписать эти значения по умолчанию, просто добавьте или удалите свойство из этих объектов конфигурации. Чтобы добавить заголовки для HTTP-метода, отличного от POST или PUT, просто добавьте новый объект с именем HTTP-метода в нижнем регистре в качестве ключа, например, `$httpProvider.defaults.headers.get = { 'My-Header' : 'value' }.
Значения по умолчанию также можно установить во время выполнения через объект $http.defaults аналогичным образом. Например:
module.run(function($http) {
$http.defaults.headers.common.Authorization = 'Basic YmVlcDpib29w'
});
Кроме того, вы можете указать свойство headers в объекте конфигурации, переданном при вызове $http(config), что переопределяет значения по умолчанию без изменения их глобально.
Чтобы явно удалить заголовок, автоматически добавленный с помощью $httpProvider.defaults.headers на уровне каждого запроса, используйте свойство headers, установив нужный заголовок в значение undefined. Например:
var req = {
method: 'POST',
url: 'http://example.com',
headers: {
'Content-Type': undefined
},
data: { test: 'test' },
}
$http(req).success(function(){...}).error(function(){...});
Преобразование запросов и ответов
Запросы и ответы можно преобразовывать с помощью функций преобразования. По умолчанию Angular применяет эти преобразования:
Преобразования запросов:
- Если свойство
dataобъекта конфигурации запроса содержит объект, сериализуйте его в формате JSON.
Преобразования ответов:
- Если обнаружен префикс XSRF, удалите его (см. раздел «Соображения по безопасности» ниже).
- Если обнаружен JSON-ответ, десериализуйте его с помощью парсера JSON.
Чтобы глобально расширить или переопределить преобразования по умолчанию, измените свойства $httpProvider.defaults.transformRequest и $httpProvider.defaults.transformResponse. Эти свойства по умолчанию являются массивом функций преобразования, что позволяет вам push или unshift новую функцию преобразования в цепочку преобразования. Вы также можете полностью переопределить все преобразования по умолчанию, назначив свои функции преобразования этим свойствам напрямую без обертки массивом. Эти значения по умолчанию снова доступны в фабрике $http во время выполнения, что может быть полезно, если у вас есть сервисы во время выполнения, которые вы хотите включить в свои преобразования.
Аналогично, чтобы локально переопределить преобразования запросов/ответов, расширьте свойства transformRequest и/или transformResponse объекта конфигурации, переданного в $http.
Кэширование
Чтобы включить кэширование, установите свойство конфигурации запроса cache в значение true (для использования кэша по умолчанию) или в объект пользовательского кэша (созданный с помощью $cacheFactory). При включённом кэше $http сохраняет ответ от сервера в указанном кэше. При следующем обращении к тому же запросу ответ выдаётся из кэша без отправки запроса на сервер.
Обратите внимание, что даже если ответ выдаётся из кэша, передача данных является асинхронной так же, как и при реальных запросах.
Если существует несколько запросов GET для одного и того же URL, которые должны быть кэшированы с использованием одного и того же кэша, но кэш ещё не заполнен, будет сделан только один запрос к серверу, а остальные запросы будут удовлетворены с помощью ответа от первого запроса.
Вы можете изменить кэш по умолчанию на новый объект (созданный с помощью $cacheFactory) путём обновления свойства $http.defaults.cache. Все запросы, которые установили своё свойство cache в значение true, теперь будут использовать этот объект кэша.
Если вы установите кэш по умолчанию в false, то только запросы, которые указывают свой собственный объект пользовательского кэша, будут кэшироваться.
Перехватыватели
Прежде чем начать создание перехватывателей, обязательно ознакомьтесь с $q и API отложенных задач/обещаний.
Для целей глобальной обработки ошибок, аутентификации или любого типа синхронной или асинхронной предварительной обработки запросов или последующей обработки ответов желательно иметь возможность перехватывать запросы перед отправкой на сервер и ответы перед передачей их коду приложения, инициировавшему эти запросы. Перехватыватели используют API обещаний (promise APIs), чтобы удовлетворить этой потребности для синхронной и асинхронной предварительной обработки.
Перехватыватели — это фабрики сервисов, которые регистрируются в $httpProvider путём добавления их в массив $httpProvider.interceptors. Фабрика вызывается и инжектируется зависимостями (если указано), и возвращает перехватыватель.
Существует два вида перехватывателей (и два вида перехватывателей отклонений):
-
request: перехватыватели вызываются с объектом httpconfig. Функция свободна изменять объектconfigили создать новый. Функция должна возвращать объектconfigнапрямую или обещание, содержащее объектconfigили новый объектconfig. -
requestError: перехватыватель вызывается, когда предыдущий перехватыватель бросил ошибку или разрешился отклонением. -
response: перехватыватели вызываются с объектом httpresponse. Функция свободна изменять объектresponseили создать новый. Функция должна возвращать объектresponseнапрямую или в виде обещания, содержащего объектresponseили новый объектresponse. -
responseError: перехватыватель вызывается, когда предыдущий перехватыватель бросил ошибку или разрешился отклонением.
// register the interceptor as a service
$provide.factory('myHttpInterceptor', function($q, dependency1, dependency2) {
return {
// optional method
'request': function(config) {
// do something on success
return config;
},
// optional method
'requestError': function(rejection) {
// do something on error
if (canRecover(rejection)) {
return responseOrNewPromise
}
return $q.reject(rejection);
},
// optional method
'response': function(response) {
// do something on success
return response;
},
// optional method
'responseError': function(rejection) {
// do something on error
if (canRecover(rejection)) {
return responseOrNewPromise
}
return $q.reject(rejection);
}
};
});
$httpProvider.interceptors.push('myHttpInterceptor');
// alternatively, register the interceptor via an anonymous factory
$httpProvider.interceptors.push(function($q, dependency1, dependency2) {
return {
'request': function(config) {
// same as above
},
'response': function(response) {
// same as above
}
};
});
Перехватыватели ответов (УСТЕРЕЗАНО)
Прежде чем начать создание перехватывателей, обязательно ознакомьтесь с $q и API отложенных задач/обещаний.
Для целей глобальной обработки ошибок, аутентификации или любого типа синхронной или асинхронной предварительной обработки полученных ответов желательно иметь возможность перехватывать ответы для http-запросов перед передачей их коду приложения, инициировавшему эти запросы. Перехватыватели ответов используют API обещаний (promise apis), чтобы удовлетворить этой потребности для синхронной и асинхронной предварительной обработки.
Перехватыватели — это фабрики сервисов, которые регистрируются в $httpProvider, добавляя их в массив $httpProvider.responseInterceptors. Фабрика вызывается и инжектируется зависимостями (если указано), и возвращает перехватыватель — функцию, которая принимает обещание и возвращает исходное или новое обещание.
// register the interceptor as a service
$provide.factory('myHttpInterceptor', function($q, dependency1, dependency2) {
return function(promise) {
return promise.then(function(response) {
// do something on success
return response;
}, function(response) {
// do something on error
if (canRecover(response)) {
return responseOrNewPromise
}
return $q.reject(response);
});
}
});
$httpProvider.responseInterceptors.push('myHttpInterceptor');
// register the interceptor via an anonymous factory
$httpProvider.responseInterceptors.push(function($q, dependency1, dependency2) {
return function(promise) {
// same as above
}
});
Соображения по безопасности
При проектировании веб-приложений учтите угрозы безопасности от:
Для устранения этих угроз должны сотрудничать как сервер, так и клиент. Angular поставляется с предварительно настроенными стратегиями, которые решают эти проблемы, но для их работы требуется сотрудничество с сервером.
Защита от уязвимости JSON
Уязвимость JSON (JSON vulnerability) позволяет сторонним веб-сайтам превращать URL ваших JSON-ресурсов в запрос JSONP в определенных условиях. Чтобы противостоять этому, ваш сервер может добавлять к всем JSON-запросам следующий строковый префикс: ")]}',\n". Angular автоматически удалит префикс перед обработкой его как JSON.
Например, если ваш сервер должен вернуть:
['one','two']
что уязвимо к атаке, ваш сервер может вернуть:
)]}', ['one','two']
Angular удалит префикс перед обработкой JSON.
Защита от межсайтовой подделки запросов (XSRF)
XSRF — это метод, с помощью которого несанкционированный сайт может получить ваши личные данные. Angular предоставляет механизм противодействия XSRF. При выполнении запросов XHR служба $http считывает токен из куки (по умолчанию, XSRF-TOKEN) и устанавливает его в качестве HTTP-заголовка (X-XSRF-TOKEN). Так как только JavaScript, выполняющийся на вашем домене, может прочитать куки, ваш сервер может быть уверен, что запрос XHR пришел от JavaScript, выполняющегося на вашем домене. Заголовок не будет установлен для запросов между доменами.
Чтобы воспользоваться этим, ваш сервер должен установить токен в куки сессии, доступной для JavaScript, под названием XSRF-TOKEN при первом HTTP-GET запросе. При последующих запросах XHR сервер может проверить, соответствует ли куки HTTP-заголовку X-XSRF-TOKEN, и, следовательно, быть уверенным, что запрос мог отправить только JavaScript, выполняющийся на вашем домене. Токен должен быть уникальным для каждого пользователя и должен быть проверяемым сервером (чтобы предотвратить создание JavaScript собственных токенов). Рекомендуется, чтобы токен представлял собой дайджест куки аутентификации вашего сайта с солью для повышения безопасности.
Имя заголовков можно указать, используя свойства xsrfHeaderName и xsrfCookieName в $httpProvider.defaults на этапе конфигурации, $http.defaults во время выполнения или в объекте конфигурации для каждого запроса.
Зависимости
Использование
$http(config);
Аргументы
| Параметр | Тип | Подробности |
|---|---|---|
| config | object | Объект, описывающий запрос и способ его обработки. Объект содержит следующие свойства:
|
Возвращаемое значение
HttpPromise |
Возвращает объект обещания со стандартным методом
|
Методы
-
get(url, [config]);
Метод-обёртка для выполнения запроса
GET.Параметры
Параметр Тип Подробности url stringОтносительный или абсолютный URL, указывающий место назначения запроса
config (необязательно)ObjectНеобязательный объект конфигурации
Возвращаемое значение
HttpPromiseОбъект обещания
-
delete(url, [config]);
Метод-обёртка для выполнения запроса
DELETE.Параметры
Параметр Тип Подробности url stringОтносительный или абсолютный URL, указывающий место назначения запроса
config (необязательно)ObjectНеобязательный объект конфигурации
Возвращаемое значение
HttpPromiseОбъект обещания
-
head(url, [config]);
Метод-обёртка для выполнения запроса
HEAD.Параметры
Параметр Тип Подробности url stringОтносительный или абсолютный URL, указывающий место назначения запроса
config (необязательно)ObjectНеобязательный объект конфигурации
Возвращаемое значение
HttpPromiseОбъект обещания
-
jsonp(url, [config]);
Метод-обёртка для выполнения запроса
JSONP.Параметры
Параметр Тип Подробности url stringОтносительный или абсолютный URL, указывающий место назначения запроса. Имя коллбэка должно быть строкой
JSON_CALLBACK.config (необязательно)ObjectНеобязательный объект конфигурации
Возвращаемое значение
HttpPromiseОбъект обещания
-
post(url, data, [config]);
Метод-обёртка для выполнения запроса
POST.Параметры
Параметр Тип Подробности url stringОтносительный или абсолютный URL, указывающий место назначения запроса
data *Содержимое запроса
config (необязательно)ObjectНеобязательный объект конфигурации
Возвращаемое значение
HttpPromiseОбъект обещания
-
put(url, data, [config]);
Метод-обёртка для выполнения запроса
PUT.Параметры
Параметр Тип Подробности url stringОтносительный или абсолютный URL, указывающий место назначения запроса
data *Содержимое запроса
config (необязательно)ObjectНеобязательный объект конфигурации
Возвращаемое значение
HttpPromiseОбъект обещания
-
patch(url, data, [config]);
Метод-обёртка для выполнения запроса
PATCH.Параметры
Параметр Тип Подробности url stringОтносительный или абсолютный URL, указывающий место назначения запроса
data *Содержимое запроса
config (необязательно)ObjectНеобязательный объект конфигурации
Возвращаемое значение
HttpPromiseОбъект обещания
Свойства
-
pendingRequests
Array.<Object>Массив объектов конфигурации для текущих ожидающих запросов. В основном предназначен для отладки.
-
defaults
Эквивалент свойства
$httpProvider.defaultsво время выполнения. Позволяет настроить значения по умолчанию для заголовков, withCredentials, а также преобразования запросов и ответов.См. разделы "Установка HTTP-заголовков" и "Преобразование запросов и ответов" выше.
© 2010–2017 Google, Inc.
Licensed under the Creative Commons Attribution License 4.0.
https://code.angularjs.org/1.2.32/docs/api/ng/service/$http