от 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


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/



-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


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».
Брайан
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.