2016-10-21 1 views
0

У меня есть уже существующий угловой код, который получает данные от API. Я пытаюсь добавить токен аутентификации в запрос.Angularjs: Почему добавление заголовка авторизации вызывает ответ состояния -1?

Для начала я попытался простой пример

.factory('getDep', [ 
     '$resource', function($resource) { 
      return $resource('/ContactsDatabaseAPI/deps/:id', { id: '@id' }, { 
       query: { 
        method: 'GET', 
        isArray: false, 
        headers: { 
         'Authorization': 'Bearer ' + token 
        } 
       }, 
       create: { 
        method: 'POST' 
       }, 
       update: { 
        method: 'PUT' 
       }, 
       remove: { 
        method: 'DELETE' 
       } 
      }); 
     } 

Когда вызов GET обжигают, и F12-ки в Chrome, я получаю сообщение об ошибке из:

angular.js:11821 OPTIONS http://localhost:56057/ContactsDatabaseAPI/deps net::ERR_CONNECTION_RESET 

Возвращение статуса -1 и никаких признаков вызова, вызывающих его на стороне сервера.

Без линии заголовков он отлично работает.

Если я попробую позвонить GET в Почтальон с тем же значением авторизации в заголовке, это также отлично работает.

Я также попытался добавить заголовок в httpInterceptor и получить тот же результат:

config.headers = config.headers || {}; 
config.headers.Authorization = 'Bearer ' + authData.token; 

Другие вещи, которые я пробовал:

  • случайное имя заголовка вызывает тот же вопрос ,
  • Я добавил 'Content-Type' = 'text/plain; charset = utf-8 ' как заголовок. Это не имеет никаких изменений в результате

Я использую угловой 1.5.6

+0

Какой у вас бэкэнд? – Aravind

+0

Использование Restier (https://github.com/OData/RESTier) В основном веб-API 2 написан на .net – Tadhg

ответ

0

Я решил свою проблему и спасибо @ Мураду-Идрисси за то, что указал мне в правильном направлении.

Причина, по которой она работала до этого, заключается в том, что перед запуском API не проводились проверки перед полетом. Когда я добавил заголовок, это изменило способ общения клиента с API. Теперь в API появился вызов OPTIONS, который вызывал ошибку. Поскольку домен был другим, это познакомило меня с миром CORS.

Добавив следующее в мой метод Application_BeginRequest() в моем веб-интерфейсе API, перед полетом проходит и мое приложение продолжается.

if (HttpContext.Current.Request.HttpMethod == "OPTIONS") 
{ 
    HttpContext.Current.Response.AddHeader("Cache-Control", "no-cache"); 
    HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST"); 
    HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept, Authorization"); 
    HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000"); 
    HttpContext.Current.Response.End(); 
} 
1

попробовать это (в контроллере):

$ http.defaults.headers.common.Authorization = «Bearer '+ токен;

+0

Мы используем несколько различных API-интерфейсов в приложении. Я считаю, что добавление этого означает, что токен привязан ко всем вызовам API. – Tadhg

+0

он делает то же самое, что и написанное, разница в том, что вы заставили HTTP-заголовок. (вы можете использовать его при каждом вызове обслуживания) –

+0

Я все равно дал ему пропуск. Я получаю то же сообщение об ошибке – Tadhg