Spec-Zone.ru › Angular.js 1.2

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

  1. $httpProvider
  2. Сервис в модуле 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.get
  • $http.head
  • $http.post
  • $http.put
  • $http.delete
  • $http.jsonp
  • $http.patch

Установка 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: перехватыватели вызываются с объектом 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
    }
  };
});

Перехватыватели ответов (УСТЕРЕЗАНО)

Прежде чем начать создание перехватывателей, обязательно ознакомьтесь с $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
  }
});

Соображения по безопасности

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

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

Для устранения этих угроз должны сотрудничать как сервер, так и клиент. 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 во время выполнения или в объекте конфигурации для каждого запроса.

Зависимости

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

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

$http(config);

Аргументы

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

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

  • method – {string} – HTTP-метод (например, 'GET', 'POST' и т.д)
  • url – {string} – Абсолютный или относительный URL ресурса, к которому отправляется запрос.
  • params – {Object.<string|Object>} – Карта строк или объектов, которые будут преобразованы в ?key1=value1&key2=value2 после URL. Если значение не является строкой, оно будет сериализовано в JSON.
  • data – {string|Object} – Данные, которые будут отправлены в качестве данных сообщения запроса.
  • headers – {Object} – Карта строк или функций, которые возвращают строки, представляющие HTTP-заголовки, которые будут отправлены серверу. Если возвращаемое значение функции равно null, заголовок не будет отправлен.
  • xsrfHeaderName – {string} – Имя HTTP-заголовка, который необходимо заполнить маркером XSRF.
  • xsrfCookieName – {string} – Имя куки, содержащего маркер XSRF.
  • transformRequest – {function(data, headersGetter)|Array.<function(data, headersGetter)>} – Функция преобразования или массив таких функций. Функция преобразования принимает тело и заголовки HTTP-запроса и возвращает его преобразованную (как правило, сериализованную) версию.
  • transformResponse – {function(data, headersGetter)|Array.<function(data, headersGetter)>} – Функция преобразования или массив таких функций. Функция преобразования принимает тело и заголовки HTTP-ответа и возвращает его преобразованную (как правило, десериализованную) версию.
  • cache – {boolean|Cache} – Если true, будет использован кеш $http по умолчанию для кэширования запроса GET, иначе, если существует экземпляр кеша, созданный с помощью $cacheFactory, будет использован этот кеш.
  • timeout – {number|Promise} – таймаут в миллисекундах или обещание, которое должно прервать запрос при выполнении.
  • withCredentials - {boolean} - нужно ли установить флаг withCredentials в объекте XHR. Подробнее см. запросы с аутентификацией.
  • responseType - {string} - см. requestType.

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

HttpPromise

Возвращает объект обещания со стандартным методом then и двумя специфическими для HTTP методами: success и error. Метод then принимает два аргумента — функцию успеха и функцию ошибки, которые будут вызваны с объектом ответа. Методы success и error принимают один аргумент — функцию, которая будет вызвана в случае успешного или неудачного выполнения запроса соответственно. Аргументы, передаваемые в эти функции, являются деструктурированным представлением объекта ответа, переданного методу then. Объект ответа имеет следующие свойства:

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

Методы

  • 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

Spec-Zone.ru

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