С AngularJS я не хочу устанавливать глобальный $http.defaults.headers.common. Могу ли я отправлять свой собственный заголовок с каждым вызовом $resource?

Я звоню на внутренний сервер, которым не могу управлять. В настоящее время он использует jQuery ajax следующим образом:

return $.ajax({
    type: "POST",
    url: "/api/cases/store",
    contentType: "application/json",
    data: JSON.stringify(parameters),
    headers: { "Authorization": cred } : {}
}) // ... etc.

Я хочу преобразовать его для использования службы $resource и заставить его работать

$http.defaults.headers.common['Authorization'] = cred;
return $resource('/api/cases/store').save();

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

Я вижу, что вы должны иметь возможность передавать пользовательские заголовки с вызовом $http, а теперь и с вызовами $resource, но я не могу найти примеров того, как это сделать в моем случае (с POST).

Я также не могу найти ничего по этому поводу в документации AngularJS. Как вы, ребята, разбираетесь в этом? Документы очень плохие!


person Daisha Lynn    schedule 30.03.2014    source источник


Ответы (3)


Вместо этого:

$http.defaults.headers.common['Authorization'] = cred;
return $resource('/api/cases/store').save();

Сделай это:

return $resource('/api/cases/store', {}, {
    save: {
        method: 'POST',
        headers: { 'Authorization': cred }
    }
}).save();

Обратите внимание, что вы должны использовать «сохранить» в качестве действия, первый ключ в третьем параметре. Не могу проверить это, поэтому дайте мне знать, если это работает.

И я согласен. В документации об этом не говорится. Взгляните на список DEFAULT_ACTIONS в исходном коде $resource в angular-resource.js.

person zumalifeguard    schedule 30.03.2014
comment
Спасибо. Ответ Ника был почти правильным, но ключ должен быть «сохранить», а не «опубликовать». - person Daisha Lynn; 31.03.2014
comment
как это назвать? я не понимаю - person deadManN; 18.09.2018

Тем не менее, в $resource document это описано. читать конечно неудобно. Вы должны выполнить для него специальное действие, и все параметры, которые вы можете передать в конфигурацию, НЕ указаны на странице $resource. Вы можете посетить страницу документации $http, чтобы узнать о возможностях объекта конфигурации.

$resource() принимает 3 аргумента: URL-адрес, объект параметров по умолчанию и объект действий. В основном действия сопоставляют имена методов с конфигурациями $http.

Вы хотите сделать настраиваемое действие, например:

var MyResource = $resource('/myendpoint/', {}, { 'post': { method: 'POST', headers: {"Authorization" : cred}}); // and any other $http options you might want

Эти действия превращаются в методы объекта MyResource, поэтому вы можете назвать действие более семантическим, чем просто «публикация», если хотите (примеры на странице документации устанавливают действие «заряда» для ресурса кредитной карты, например ).

person Nick    schedule 30.03.2014
comment
Хорошо, это приближается, но я не могу использовать настраиваемое действие. Если бы у меня был свой сервер, он бы работал. Это должно быть семантическим эквивалентом вызова jQuery.ajax выше. - person Daisha Lynn; 31.03.2014
comment
Почему нельзя использовать настраиваемое действие? Возможный запрос по-прежнему является POST или GET (см. параметр method в конфигурации). Нет ничего другого с точки зрения сервера. ответ Зумы ниже имеет очень краткий пример. - person Nick; 31.03.2014
comment
Ник, когда я использую настраиваемое действие, оно не работает. Там, где у вас есть { 'post': ..., эта часть приводит к тому, что заголовок не попадает на сервер. Я проверил сервер и request.Headers не содержит правильного заголовка. Я проверил ответ Зумы, и это было основным отличием ... ключ должен быть «сохранить». Я также прошел через код угловых ресурсов и убедился, что «сохранить» находится в списке для DEFAULT_ACTIONS, а не «опубликовать». - person Daisha Lynn; 31.03.2014
comment
Ник, оказывается, то, что вы сказали, действительно работает на нашем сервере (без того, чтобы я модифицировал сервер). Выше, где у вас есть { 'post':..., вы фактически определяете пользовательский метод под названием post, не уверен, что вы это имели в виду. Но в этом случае все, что мне нужно было сделать, это вызвать post() в конце цепочки вместо save(). Просто подумал, что дам тебе знать. - person Daisha Lynn; 02.04.2014

Документация для http://docs.angularjs.org/api/ng/service/%24http довольно надежна, как и большая часть другой документации. на их сайте.

И вы можете абсолютно точно определить свои заголовки аутентификации для каждого отдельного вызова AJAX.

попробуйте что-то вроде этого:

$http({
    method: 'POST',
    url: 'serverUrl',
    data: parameters,
    headers: { Authorization: cred }
});
person Brocco    schedule 30.03.2014
comment
Я уже использую сервис $resource. Я бы предпочел продолжать использовать это, чем использовать службу $http. Как передать эти заголовки службе $resource? - person Daisha Lynn; 31.03.2014
comment
Я не уверен, я не использовал $resource, его изучение есть в моем списке задач - person Brocco; 31.03.2014
comment
Может ли кто-нибудь помочь с моей проблемой, которая похожа на эту? stackoverflow.com/questions/31724031/ - person Matt Saunders; 03.08.2015