от jquery $ .ajax до angular $ http

122

У меня есть этот фрагмент кода jQuery, который отлично работает с перекрестным происхождением:

jQuery.ajax({
    url: "http://example.appspot.com/rest/app",
    type: "POST",
    data: JSON.stringify({"foo":"bar"}),
    dataType: "json",
    contentType: "application/json; charset=utf-8",
    success: function (response) {
        console.log("success");
    },
    error: function (response) {
        console.log("failed");
    }
});

Теперь я пытаюсь безуспешно преобразовать это в код Angular.js:

$http({
    url: "http://example.appspot.com/rest/app",
    dataType: "json",
    method: "POST",
    data: JSON.stringify({"foo":"bar"}),
    headers: {
        "Content-Type": "application/json; charset=utf-8"
    }
}).success(function(response){
    $scope.response = response;
}).error(function(error){
    $scope.error = error;
});

Любая помощь приветствуется.

Бесконечный
источник
3
Не знаю angular.js, но, может быть, faile () - неправильное имя функции?
Богдан Рыбак
обнаружил еще одну похожую проблему stackoverflow.com/questions/11786562/…
Бесконечный
мог бы найти решение stackoverflow.com/questions/12111936/… нужно копать глубоко ...
Endless
Запрос OPTIONS будет выдан браузером, он будет прозрачен для AngularJS / вашего приложения. Если OPTION завершится успешно, последует исходный запрос (POST / GET / что угодно), и ваш код будет отозван для основного запроса, а не для OPTION.
pkozlowski.opensource
Вероятно, Angular не меняет метод запроса на OPTIONS. Вероятно, ваш браузер проверяет, может ли он выполнять запрос CORS. Если вы пытаетесь позвонить в отдельный домен, ваш браузер сначала сделает запрос OPTIONS, чтобы узнать, разрешен ли он.
Ян

Ответы:

202

AngularJS вызывает $ http примерно так:

$http({
    url: "http://example.appspot.com/rest/app",
    method: "POST",
    data: {"foo":"bar"}
}).then(function successCallback(response) {
        // this callback will be called asynchronously
        // when the response is available
        $scope.data = response.data;
    }, function errorCallback(response) {
        // called asynchronously if an error occurs
        // or server returns response with an error status.
        $scope.error = response.statusText;
});

или можно было бы написать еще проще, используя методы быстрого доступа:

$http.post("http://example.appspot.com/rest/app", {"foo":"bar"})
.then(successCallback, errorCallback);

Следует обратить внимание на ряд моментов:

  • Версия AngularJS более лаконична (особенно с использованием метода .post ())
  • AngularJS позаботится о преобразовании объектов JS в строку JSON и установит заголовки (они настраиваются)
  • Функции обратного вызова имеют имена successи errorсоответственно (также обратите внимание на параметры каждого обратного вызова) - устарело в angular v1.5
  • thenвместо этого используйте функцию.
  • Более подробную информацию об thenиспользовании можно найти здесь

Вышеупомянутое - это всего лишь быстрый пример и несколько указателей, не забудьте проверить документацию AngularJS, чтобы узнать больше: http://docs.angularjs.org/api/ng.$http

pkozlowski.opensource
источник
2
Хорошо знать! однако я не понимаю его клиентскую ошибку, с которой я имею дело, Angular изменил метод запроса на OPTIONS. думаю, что мне нужно сделать кое-что на стороне сервера, чтобы поддержать его
Endless
Да, думаю, вам нужно сначала разобраться с проблемами на стороне сервера. Тогда вы сможете пользоваться всеми возможностями angular $ http на стороне клиента. Вероятно, вы видите дополнительный запрос OPTIONS, поскольку AngularJS отправляет больше / разных заголовков по сравнению с jQuery.
pkozlowski.opensource
1
Примечание: в ГЭТ "Params:" но не "данные:" см stackoverflow.com/questions/13760070/...
xander27
5
paramsи dataэто две разные вещи: параметры попадают в URL (строку запроса), а данные - в тело запроса (только для типов запросов, которые действительно могут иметь тело).
pkozlowski.opensource
"Angular измените метод запроса на OPTIONS. Думаю, мне нужно сделать некоторые вещи на стороне сервера, чтобы его поддержать" У меня такая же проблема, что angular добавляет, что jquery не делает?
Эндрю Люринг
1

Мы можем реализовать запрос ajax, используя службу http в AngularJs, которая помогает читать / загружать данные с удаленного сервера.

Ниже перечислены методы службы $ http,

 $http.get()
 $http.post()
 $http.delete()
 $http.head()
 $http.jsonp()
 $http.patch()
 $http.put()

Один из примеров:

    $http.get("sample.php")
        .success(function(response) {
            $scope.getting = response.data; // response.data is an array
    }).error(){

        // Error callback will trigger
    });

http://www.drtuts.com/ajax-requests-angularjs/

Vijayaragavan
источник
0

Вы можете использовать это:

Скачать "angular-post-fix": "^ 0.1.0"

Затем добавьте httpPostFix к своим зависимостям при объявлении модуля angular.

Ссылка: https://github.com/PabloDeGrote/angular-httppostfix

Тевфик Гариани
источник
-5

вы можете использовать $ .param для назначения данных:

 $http({
  url: "http://example.appspot.com/rest/app",
  method: "POST",
  data: $.param({"foo":"bar"})
  }).success(function(data, status, headers, config) {
   $scope.data = data;
  }).error(function(data, status, headers, config) {
   $scope.status = status;
 });

посмотрите на это: AngularJS + ASP.NET Web API Cross-Domain Issue

Hanane
источник
4
Обратите внимание, что $ .param - это jQuery, поэтому для его использования вам понадобится загруженный jQuery. Пример использования перехватчика $ http transformRequest без jQuery см. На pastebin.com/zsn9ASkM
Брайан,
@Brian Подождите, разве jQuery не является зависимостью от AngularJS? У вас никогда не будет $ http без предварительной загрузки jQuery.
jnm2
2
@ jnm2 - нет, jQuery не является зависимостью от AngularJS. $ http относится к компоненту службы Angular $ http , а не к чему-либо из jQuery. В AngularJS есть "jQuery Lite", доступный для управления DOM, но он очень ограничен. Из элемента Angular - если доступен jQuery, angular.element является псевдонимом для функции jQuery. Если jQuery недоступен, angular.element делегирует встроенное подмножество jQuery Angular, называемое «jQuery lite» или «jqLite».
Брайан