Spec-Zone.ru › Angular.js 1.8

Улучшить эту документацию Просмотреть исходный код $http

  1. $httpProvider
  2. сервис в модуле ng

Обзор

Сервис $http — это основной сервис AngularJS, который обеспечивает взаимодействие с удалёнными HTTP-серверами через объект XMLHttpRequest браузера или через JSONP.

Для тестирования приложений, использующих сервис $http, см. $httpBackend mock.

Для более высокого уровня абстракции, ознакомьтесь со службой $resource.

API $http основан на API отложенных задач/обещаний, предоставленных службой $q. Хотя для простых сценариев использования это не имеет большого значения, для продвинутых сценариев важно ознакомиться с этими API и предоставляемыми ими гарантиями.

Общее использование

Сервис $http — это функция, которая принимает один аргумент — объект конфигурации, используемый для генерации HTTP-запроса, и возвращает обещание, которое выполняется (успех запроса) или отклоняется (ошибка запроса) с объектом ответа.

// Simple GET request example:
$http({
  method: 'GET',
  url: '/someUrl'
}).then(function successCallback(response) {
    // this callback will be called asynchronously
    // when the response is available
  }, function errorCallback(response) {
    // called asynchronously if an error occurs
    // or server returns response with an error status.
  });

Методы сокращённого доступа

Также доступны методы сокращённого доступа. Все методы сокращённого доступа требуют указания URL, а данные запроса должны быть переданы для запросов POST/PUT. В качестве последнего аргумента можно передать необязательную конфигурацию.

$http.get('/someUrl', config).then(successCallback, errorCallback);
$http.post('/someUrl', data, config).then(successCallback, errorCallback);

Полный список методов сокращённого доступа:

  • $http.get
  • $http.head
  • $http.post
  • $http.put
  • $http.delete
  • $http.jsonp
  • $http.patch

Написание юнит-тестов, использующих $http

При написании юнит-тестов (с использованием ngMock) необходимо вызвать $httpBackend.flush() для обработки каждого ожидающего запроса с использованием обученных ответов.

$httpBackend.expectGET(...);
$http.get(...);
$httpBackend.flush();

Установка 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).then(function(){...}, function(){...});

Преобразование запросов и ответов

И запросы, и ответы можно преобразовывать с помощью функций преобразования: transformRequest и transformResponse. Эти свойства могут быть одиночной функцией, возвращающей преобразованное значение (function(data, headersGetter, status)) или массивом таких функций преобразования, что позволяет вам push или unshift новую функцию преобразования в цепочку преобразования.

Примечание: AngularJS не создаёт копию параметра data перед его передачей в цепочку преобразования transformRequest. Это означает, что изменения свойств data не являются локальными для функции преобразования (поскольку Javascript передает объекты по ссылке). Например, при вызове $http.get(url, $scope.myObject), изменения свойств объекта в функции transformRequest будут отражаться в области видимости и во всех шаблонах, где объект привязан к данным. Для предотвращения этого функции преобразования не должны иметь побочных эффектов. Если вам нужно изменить свойства, рекомендуется создать копию данных или создать новый объект для возврата.

Преобразования по умолчанию

Поставщик $httpProvider и служба $http экспонируют свойства defaults.transformRequest и defaults.transformResponse. Если запрос не предоставляет собственных преобразований, будут применены эти преобразования.

Можно дополнить или заменить преобразования по умолчанию, изменив эти свойства, добавив или заменив массив.

AngularJS предоставляет следующие преобразования по умолчанию:

Преобразования запросов ($httpProvider.defaults.transformRequest и $http.defaults.transformRequest) — это массив с одной функцией, которая выполняет следующее:

  • Если свойство data объекта конфигурации запроса содержит объект, сериализуйте его в формате JSON.

Преобразования ответов ($httpProvider.defaults.transformResponse и $http.defaults.transformResponse) — это массив с одной функцией, которая выполняет следующее:

  • Если обнаружен префикс XSRF, удалите его (см. раздел "Учёт мер безопасности" ниже).
  • Если Content-Type равно application/json или ответ похож на JSON, десериализуйте его с помощью парсера JSON.

Переопределение преобразований по умолчанию для каждого запроса

Если вы хотите переопределить преобразования запросов/ответов только для одного запроса, укажите свойства transformRequest и/или transformResponse в объекте конфигурации, переданном в $http.

Обратите внимание, что если вы укажете эти свойства в объекте конфигурации, преобразования по умолчанию будут переопределены. Если вы хотите дополнить преобразования по умолчанию, необходимо включить их в ваш локальный массив преобразований.

Следующий код демонстрирует добавление нового преобразования ответа, которое будет выполнено после выполнения стандартных преобразований ответа.

function appendTransform(defaults, transform) {

  // We can't guarantee that the default transformation is an array
  defaults = angular.isArray(defaults) ? defaults : [defaults];

  // Append the new transformation to the defaults
  return defaults.concat(transform);
}

$http({
  url: '...',
  method: 'GET',
  transformResponse: appendTransform($http.defaults.transformResponse, function(value) {
    return doTransform(value);
  })
});

Кэширование

$http ответы по умолчанию не кэшируются. Чтобы включить кэширование, необходимо установить значение config.cache или значение по умолчанию для кэша в TRUE или в объект кэша (созданный с помощью $cacheFactory). Если определено, значение config.cache имеет приоритет над значением кэша по умолчанию.

Для того чтобы:

  • кэшировать все ответы — установите значение кэша по умолчанию в TRUE или в объект кэша
  • кэшировать определённый ответ — установите значение config.cache в TRUE или в объект кэша

Если кэширование включено, но ни кэш по умолчанию, ни config.cache не установлены в объект кэша, используется объект кэша по умолчанию $cacheFactory("$http").

Значение кэша по умолчанию можно установить, обновив свойство $http.defaults.cache или свойство $httpProvider.defaults.cache.

При включенном кэшировании, $http сохраняет ответ с сервера, используя соответствующий объект кэша. При последующем выполнении такого же запроса ответ возвращается из кэша без отправки запроса на сервер.

Обратите внимание на следующие моменты:

  • Кэшируются только запросы GET и JSONP.
  • Ключ кэша — это URL запроса, включая параметры поиска; заголовки не учитываются.
  • Кэшированные ответы возвращаются асинхронно, так же, как и ответы с сервера.
  • Если с помощью одного кэша выполняются несколько идентичных запросов, а кэш ещё не заполнен, один запрос будет отправлен на сервер, а остальные запросы вернут тот же ответ.
  • Заголовок cache-control в ответе не влияет на кэширование ответов.

Перехватывающие фильтры

Прежде чем начать создание перехватывающих фильтров, убедитесь, что вы понимаете $q и API отложенных задач/обещаний.

Для целей обработки глобальных ошибок, аутентификации или любого вида синхронной или асинхронной предобработки запроса или постобработки ответов желательно иметь возможность перехватывать запросы перед отправкой на сервер и ответы перед передачей приложению, инициировавшему эти запросы. Перехватывающие фильтры используют API обещаний, чтобы удовлетворить эту потребность как для синхронной, так и для асинхронной предобработки.

Перехватывающие фильтры — это фабрики служб, которые регистрируются в $httpProvider путем добавления их в массив $httpProvider.interceptors. Фабрика вызывается и инжектируется зависимостями (если указаны) и возвращает перехватывающий фильтр.

Существует два типа перехватывающих фильтров (и два типа перехватывающих фильтров для отклонений):

  • request: перехватывающие фильтры вызываются с объектом конфигурации http config. Функция может изменить объект config или создать новый. Функция должна вернуть объект config напрямую или обещание, содержащее объект config или новый объект config.
  • requestError: перехватывающий фильтр вызывается, когда предыдущий перехватывающий фильтр генерирует ошибку или отклоняется.
  • response: перехватывающие фильтры вызываются с объектом http response. Функция может изменить объект 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
    }
  };
});

Учёт мер безопасности

При проектировании веб-приложений следует учитывать угрозы безопасности от:

  • уязвимости JSON
  • XSRF

Как сервер, так и клиент должны сотрудничать, чтобы устранить эти угрозы. AngularJS поставляется с предварительно настроенными стратегиями, которые решают эти проблемы, но для их работы требуется сотрудничество с сервером.

Защита от уязвимости JSON

Уязвимость JSON позволяет стороннему веб-сайту в некоторых условиях преобразовать URL вашего JSON-ресурса в запрос JSONP. Чтобы противостоять этому, ваш сервер может добавлять к всем JSON-запросам следующую строку ")]}',\n". AngularJS автоматически удалит префикс перед обработкой данных как JSON.

Например, если ваш сервер должен вернуть:

['one','two']

что уязвимо к атаке, ваш сервер может вернуть:

)]}',
['one','two']

AngularJS удалит префикс перед обработкой JSON.

Защита от межсайтовых поддельных запросов (XSRF)

XSRF — это техника атаки, позволяющая злоумышленнику обмануть авторизованного пользователя, чтобы он непреднамеренно выполнил действия на вашем сайте. AngularJS предоставляет механизм для противодействия XSRF. При выполнении запросов XHR сервис $http считывает токен из cookie (по умолчанию XSRF-TOKEN) и устанавливает его как HTTP-заголовок (по умолчанию X-XSRF-TOKEN). Так как только JavaScript, выполняемый на вашем домене, может прочитать cookie, ваш сервер может быть уверен, что запрос XHR пришел из JavaScript, выполняемого на вашем домене.

Для этого ваш сервер должен установить токен в cookie сессии, доступной для JavaScript, под названием XSRF-TOKEN, в первом запросе GET. При последующих запросах XHR сервер может проверить, что cookie соответствует HTTP-заголовку X-XSRF-TOKEN, и, таким образом, убедиться, что запрос мог отправить только JavaScript, выполняемый на вашем домене. Токен должен быть уникальным для каждого пользователя и должен быть проверяемым сервером (чтобы предотвратить создание JavaScript своих собственных токенов). Мы рекомендуем использовать дайджест cookie аутентификации вашего сайта с добавлением соли для повышения безопасности.

Заголовок — по умолчанию — не будет установлен для запросов между доменами. Это предотвращает несанкционированный доступ серверов (например, вредоносных или скомпрометированных сторонних API) к токенам XSRF ваших пользователей и их раскрытие в межсайтовой подделке запросов. Если вы хотите, вы можете доверять дополнительным источникам, чтобы они также получали токен XSRF, добавив их в xsrfTrustedOrigins. Это может быть полезно, например, если ваше приложение, размещенное на example.com, нуждается в доступе к вашему API на api.example.com. См. $httpProvider.xsrfTrustedOrigins для получения дополнительной информации.

Предупреждение
Только доверенные источники, которыми вы управляете, и убедитесь, что вы понимаете последствия этого.

Имя cookie и заголовка можно указать, используя свойства xsrfCookieName и xsrfHeaderName либо $httpProvider.defaults во время конфигурации, $http.defaults во время выполнения, или в объекте конфигурации по запросу.

Для предотвращения коллизий в средах, где несколько приложений AngularJS используют один и тот же домен или поддомен, мы рекомендуем каждому приложению использовать уникальное имя cookie.

Зависимости

  • $httpBackend
  • $cacheFactory
  • $rootScope
  • $q
  • $injector

Использование

$http(config);

Аргументы

Параметр Тип Подробности
config object

Объект, описывающий запрос и то, как он должен быть обработан. Объект имеет следующие свойства:

  • method – {string} – HTTP-метод (например, 'GET', 'POST' и т.д)
  • url – {string|TrustedObject} – Абсолютный или относительный URL ресурса, который запрашивается; или объект, созданный вызовом $sce.trustAsResourceUrl(url).
  • params – {Object.<string|Object>} – Карта строк или объектов, которые будут сериализованы с paramSerializer и добавлены в качестве параметров GET.
  • data – {string|Object} – Данные, которые будут отправлены в качестве данных сообщения запроса.
  • headers – {Object} – Карта строк или функций, возвращающих строки, представляющие HTTP-заголовки для отправки на сервер. Если возвращаемое значение функции равно null, заголовок не будет отправлен. Функции принимают объект конфигурации в качестве аргумента.
  • eventHandlers - {Object} - Обработчики событий для привязки к объекту XMLHttpRequest. Для привязки событий к объекту XMLHttpRequest upload используйте uploadEventHandlers. Обработчик будет вызван в контексте блока $apply.
  • uploadEventHandlers - {Object} - Обработчики событий для привязки к объекту XMLHttpRequest upload. Для привязки событий к объекту XMLHttpRequest используйте eventHandlers. Обработчик будет вызван в контексте блока $apply.
  • xsrfHeaderName – {string} – Имя HTTP-заголовка для заполнения токеном XSRF.
  • xsrfCookieName – {string} – Имя cookie, содержащего токен XSRF.
  • transformRequest – {function(data, headersGetter)|Array.<function(data, headersGetter)>} – функция преобразования или массив таких функций. Функция преобразования принимает тело и заголовки http-запроса и возвращает преобразованную (обычно сериализованную) версию. См. Замена стандартных преобразований
  • transformResponse – {function(data, headersGetter, status)|Array.<function(data, headersGetter, status)>} – функция преобразования или массив таких функций. Функция преобразования принимает тело, заголовки и статус http-ответа и возвращает преобразованную (обычно десериализованную) версию. См. Замена стандартных преобразований
  • paramSerializer - {string|function(Object<string,string>):string} - Функция, используемая для подготовки строкового представления параметров запроса (указанных в виде объекта). Если задано строкой, она интерпретируется как функция, зарегистрированная в $injector, что означает, что вы можете создать свой собственный сериализатор, зарегистрировав его как сервис. По умолчанию используется сериализатор $httpParamSerializer; в качестве альтернативы вы можете использовать $httpParamSerializerJQLike
  • cache – {boolean|Object} – Логическое значение или объект, созданный с помощью $cacheFactory, для включения или отключения кэширования HTTP-ответа. См. $http Caching для получения дополнительной информации.
  • timeout – {number|Promise} – таймаут в миллисекундах или обещание, которое должно прервать запрос при его разрешении.

    Численный таймаут или обещание, возвращенное из $timeout, установит xhrStatus в ответе в "timeout", а любое другое разрешенное обещание установит его в "abort", следуя стандартному поведению XMLHttpRequest.

  • withCredentials - {boolean} - флаг для установки withCredentials флага в объекте XHR. См. запросы с данными для получения дополнительной информации.

  • responseType - {string} - см. XMLHttpRequest.responseType.

Возвращаемые значения

HttpPromise

Обещание Promise, которое будет выполнено (успех запроса) или отклонено (ошибка запроса) с объектом ответа.

Объект ответа имеет следующие свойства:

  • data – {string|Object} – Тело ответа, преобразованное с помощью функций преобразования.
  • status – {number} – HTTP-код состояния ответа.
  • headers – {function([headerName])} – Функция получения заголовков.
  • config – {Object} – Объект конфигурации, который использовался для генерации запроса.
  • statusText – {string} – Текст HTTP-кода состояния ответа.
  • xhrStatus – {string} – Статус XMLHttpRequest (complete, error, timeout или abort).

Код состояния ответа между 200 и 299 считается кодом успешного состояния и приведет к вызову обратного вызова успеха. Любой код состояния ответа вне этого диапазона считается кодом ошибки и приведет к вызову обратного вызова ошибки. Кроме того, коды состояния меньше -1 нормализуются до нуля. -1 обычно означает, что запрос был прерван, например, с помощью config.timeout. Дополнительная информация о состоянии может быть доступна в свойстве xhrStatus.

Обратите внимание, что если ответ является перенаправлением, XMLHttpRequest прозрачно его выполнит, что означает, что результат (успех или ошибка) будет определяться конечным кодом состояния ответа.

Методы

  • get(url, [config]);

    Метод-костырь для выполнения запроса GET.

    Параметры

    Параметр Тип Подробности
    url stringTrustedObject

    Абсолютный или относительный URL ресурса, запрашиваемого; или объект, созданный вызовом $sce.trustAsResourceUrl(url).

    config
    (необязательно)
    Object

    Необязательный объект конфигурации. См. $http() аргументы.

    Возвращает

    HttpPromise

    Обещание, которое будет выполнено или отклонено с объектом ответа. См. $http() значение возврата.

  • delete(url, [config]);

    Метод-костырь для выполнения запроса DELETE.

    Параметры

    Параметр Тип Подробности
    url stringTrustedObject

    Абсолютный или относительный URL ресурса, запрашиваемого; или объект, созданный вызовом $sce.trustAsResourceUrl(url).

    config
    (необязательно)
    Object

    Необязательный объект конфигурации. См. $http() аргументы.

    Возвращает

    HttpPromise

    Обещание, которое будет выполнено или отклонено с объектом ответа. См. $http() значение возврата.

  • head(url, [config]);

    Метод-костырь для выполнения запроса HEAD.

    Параметры

    Параметр Тип Подробности
    url stringTrustedObject

    Абсолютный или относительный URL ресурса, запрашиваемого; или объект, созданный вызовом $sce.trustAsResourceUrl(url).

    config
    (необязательно)
    Object

    Необязательный объект конфигурации. См. $http() аргументы.

    Возвращает

    HttpPromise

    Обещание, которое будет выполнено или отклонено с объектом ответа. См. $http() значение возврата.

  • jsonp(url, [config]);

    Метод-костырь для выполнения запроса JSONP.

    Обратите внимание, что, поскольку запросы JSONP чувствительны, поскольку ответ получает полный доступ к браузеру, URL должен быть объявлен через $sce как надёжный URL ресурса. Вы можете доверять URL, добавив его в список надёжных URL ресурсов через $sceDelegateProvider.trustedResourceUrlList или явно доверив URL через $sce.trustAsResourceUrl(url).

    Следует избегать генерации URL для запроса JSONP из данных, предоставленных пользователем. Предоставляйте дополнительные параметры запроса через свойство params параметра config, а не изменяя сам URL.

    Запросы JSONP должны указывать обратный вызов, используемый в ответе от сервера. Этот обратный вызов передаётся как параметр запроса. Вы должны указать имя этого параметра, установив свойство jsonpCallbackParam в объекте конфигурации запроса.

    $http.jsonp('some/trusted/url', {jsonpCallbackParam: 'callback'})
    

    Вы также можете указать имя параметра обратного вызова по умолчанию в $http.defaults.jsonpCallbackParam. Изначально оно установлено в 'callback'.

    Вы больше не можете использовать строку JSON_CALLBACK в качестве заполнитель для указания места, куда должно попадать значение параметра обратного вызова.

    Если вы хотите настроить место и способ хранения обратных вызовов, то попробуйте переопределить или декорировать сервис $jsonpCallbacks.

    Параметры

    Параметр Тип Подробности
    url stringTrustedObject

    Абсолютный или относительный URL ресурса, запрашиваемого; или объект, созданный вызовом $sce.trustAsResourceUrl(url).

    config
    (необязательно)
    Object

    Необязательный объект конфигурации. См. $http() аргументы.

    Возвращает

    HttpPromise

    Обещание, которое будет выполнено или отклонено с объектом ответа. См. $http() значение возврата.

  • post(url, data, [config]);

    Метод-костырь для выполнения запроса POST.

    Параметры

    Параметр Тип Подробности
    url string

    Относительный или абсолютный URL, указывающий место назначения запроса

    data *

    Содержание запроса

    config
    (необязательно)
    Object

    Необязательный объект конфигурации. См. $http() аргументы.

    Возвращает

    HttpPromise

    Обещание, которое будет выполнено или отклонено с объектом ответа. См. $http() значение возврата.

  • put(url, data, [config]);

    Метод-костырь для выполнения запроса PUT.

    Параметры

    Параметр Тип Подробности
    url string

    Относительный или абсолютный URL, указывающий место назначения запроса

    data *

    Содержание запроса

    config
    (необязательно)
    Object

    Необязательный объект конфигурации. См. $http() аргументы.

    Возвращает

    HttpPromise

    Обещание, которое будет выполнено или отклонено с объектом ответа. См. $http() значение возврата.

  • patch(url, data, [config]);

    Метод-костырь для выполнения запроса PATCH.

    Параметры

    Параметр Тип Подробности
    url string

    Относительный или абсолютный URL, указывающий место назначения запроса

    data *

    Содержание запроса

    config
    (необязательно)
    Object

    Необязательный объект конфигурации. См. $http() аргументы.

    Возвращает

    HttpPromise

    Обещание, которое будет выполнено или отклонено с объектом ответа. См. $http() значение возврата.

Свойства

  • pendingRequests

    Array.<Object>

    Массив объектов конфигурации для текущих ожидающих запросов. В основном предназначен для отладки.

  • defaults

    Выполняемый эквивалент свойства $httpProvider.defaults. Позволяет настроить заголовки по умолчанию, withCredentials, а также преобразования запросов и ответов.

    См. разделы «Установка HTTP-заголовков» и «Преобразование запросов и ответов» выше.

Пример

© 2010–2020 Google, Inc.
Licensed under the Creative Commons Attribution License 3.0.
https://code.angularjs.org/1.8.2/docs/api/ng/service/$http

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API