2013-05-20 5 views
0

У меня есть угловое приложение, которое использует службу $ http для извлечения данных с удаленного сервера. При определенных обстоятельствах мне нужно добавить значение пользовательского заголовка к каждому запросу, и я бы хотел использовать facilities provided by the framework для выполнения этого.

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

Возможно ли использовать requestTransform для выполнения этой задачи? Или вам нужно будет и обрезать мои данные, получая вызовы в службе, которая получает значение заголовка с веб-сервера приложения, прежде чем отправлять вызов $ http на удаленный сервер.

ответ

2

Нет, функции запроса/ответа на преобразование синхронны, поэтому не могут использоваться для вашего конкретного случая. К счастью, запрос перехватчиков был недавно добавлен в ветвь 1.1.x AngularJS. Эти перехватчики основаны на обещаниях, поэтому вы можете использовать их для выполнения асинхронной обработки до фактического вызова.

Более подробная информация в разделе «перехватчики» из http://code.angularjs.org/1.1.4/docs/api/ng.$http

+0

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

+0

@ Джейсон Я действительно не думаю, что вы можете делать асинхронные запросы в функциях преобразования ... но дайте ему понять ... –

+0

О, я неправильно понял ваш комментарий. я вижу, что вы сейчас говорите, функция преобразования должна завершиться синхронно, так что результаты доступны для вызова службы $ http. понял. – Jason

1

Если вы устанавливаете свои функции преобразования Ajax глобально (через $httpProvider.defaults.transformRequest) и ваши функции преобразования также используют $ HTTP сделать предполетной запрос, чем вы могли бы застряли в бесконечном цикле, потому что каждый запрос предполетного вызова будет рекурсивно вызывать другой запрос предполетной проверки.

Таким образом, единственный вариант - установить функцию преобразования запроса только на вашу конкретную службу $ http.

Теперь, поскольку trnf. функции выполняются синхронно (см. https://github.com/angular/angular.js/blob/master/src/ng/http.js#L671), вы можете захотеть убедиться, что ваш предпродажный запрос также выполняется синхронно, но поскольку вы не можете сделать это с помощью $ http, ваш единственный вариант - использовать другую форму для выполнения предпродажного запроса ajax (либо с jQuery.ajax() или изначально с простым JS).

+0

Хорошая точка, я не считал потенциал для бесконечного цикла, мне придется принять это во внимание – Jason