từ jquery $ .ajax sang $ http góc cạnh


122

Tôi có đoạn mã jQuery này hoạt động tốt với nguồn gốc chéo:

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");
    }
});

Bây giờ tôi đang cố gắng chuyển đổi mã này sang mã Angular.js mà không thành công:

$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;
});

Bất kỳ sự giúp đỡ nào được đánh giá cao.


3
Không biết angle.js nhưng có lẽ faile () là tên sai của một hàm?
Bogdan Rybak

tìm thấy một vấn đề khác simular stackoverflow.com/questions/11786562/...
Endless

có thể đã tìm thấy một giải pháp stackoverflow.com/questions/12111936/... nhu cầu to digg sâu ...
Endless

Yêu cầu OPTIONS sẽ được đưa ra bởi một trình duyệt, nó sẽ minh bạch đối với AngularJS / ứng dụng của bạn. Nếu TÙY CHỌN thành công, yêu cầu ban đầu (POST / GET / bất cứ điều gì) sẽ theo sau và mã của bạn sẽ được gọi lại cho yêu cầu chính không phải là TÙY CHỌN.
pkozlowski.opensource

Nó có thể không phải là Angular thay đổi phương thức yêu cầu thành OPTIONS. Có thể trình duyệt của bạn đang kiểm tra xem nó có thể thực hiện yêu cầu CORS hay không. Nếu bạn đang cố thực hiện cuộc gọi đến một miền riêng biệt, trình duyệt của bạn sẽ đưa ra yêu cầu TÙY CHỌN trước để xem liệu nó có được phép hay không.
Ian

Câu trả lời:


202

AngularJS cách gọi $ http sẽ giống như sau:

$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;
});

hoặc có thể được viết đơn giản hơn bằng cách sử dụng các phương thức phím tắt:

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

Có một số điều cần lưu ý:

  • Phiên bản AngularJS ngắn gọn hơn (đặc biệt là sử dụng phương thức .post ())
  • AngularJS sẽ chăm sóc chuyển đổi các đối tượng JS thành chuỗi JSON và thiết lập tiêu đề (chúng có thể tùy chỉnh)
  • Các hàm gọi lại được đặt tên successerrortương ứng (cũng xin lưu ý các thông số của mỗi hàm gọi lại) - Không được dùng trong phiên bản góc v1.5
  • sử dụng thenchức năng thay thế.
  • Thông tin thêm về thenviệc sử dụng có thể được tìm thấy ở đây

Trên đây chỉ là một ví dụ nhanh và một số gợi ý, hãy nhớ kiểm tra tài liệu AngularJS để biết thêm: http://docs.angularjs.org/api/ng.$http


2
Tốt để biết! tuy nhiên, tôi không hiểu lỗi máy khách mà tôi đang xử lý, Angular thay đổi phương thức Yêu cầu thành TÙY CHỌN. nghĩ rằng tôi phải làm một số công cụ phía máy chủ để hỗ trợ nó
Endless

Có, tôi đoán bạn cần phải giải quyết các vấn đề phía máy chủ trước. Sau đó, bạn sẽ có thể tận hưởng toàn bộ sức mạnh của $ http của angle ở ​​phía máy khách. Có thể bạn thấy một yêu cầu TÙY CHỌN bổ sung vì AngularJS đang gửi nhiều tiêu đề / tiêu đề khác nhau hơn so với jQuery.
pkozlowski.opensource,

1
LƯU Ý: trong nhận dữ liệu "params:" chứ không phải ":" xem stackoverflow.com/questions/13760070/…
xander27

5
paramsdatalà 2 thứ khác nhau: tham số kết thúc trong URL (chuỗi truy vấn) trong khi dữ liệu - trong nội dung yêu cầu (chỉ dành cho các loại yêu cầu thực sự có thể có nội dung).
pkozlowski.opensource

"Angular thay đổi phương thức Yêu cầu thành OPTIONS. Tôi nghĩ rằng tôi phải thực hiện một số công cụ phía máy chủ để hỗ trợ nó" Tôi đang gặp vấn đề tương tự, điều gì có góc thêm mà jquery không?
Andrew Luhring

1

Chúng ta có thể thực hiện yêu cầu ajax bằng cách sử dụng dịch vụ http trong AngularJs, giúp đọc / tải dữ liệu từ máy chủ từ xa.

Các phương thức dịch vụ $ http được liệt kê bên dưới,

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

Một trong những ví dụ:

    $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

bạn có thể sử dụng $ .param để gán dữ liệu:

 $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;
 });

hãy xem phần này: Vấn đề liên quan đến API web của AngularJS + ASP.NET


4
Chỉ cần lưu ý rằng $ .param là jQuery, vì vậy bạn sẽ cần tải jQuery để sử dụng nó. Đối với một ví dụ jQuery miễn phí sử dụng $ http transformRequest đánh chặn, xem pastebin.com/zsn9ASkM
Brian

@Brian Chờ một chút, jQuery có phải là phụ thuộc của AngularJS không? Bạn sẽ không bao giờ có $ http nếu không tải jQuery trước.
jnm2

2
@ jnm2 - không, jQuery không phải là phần phụ thuộc của AngularJS. $ http đề cập đến thành phần dịch vụ Angular $ http , không phải bất kỳ thứ gì từ jQuery. AngularJS có sẵn "jQuery Lite" để thao tác DOM, nhưng nó rất hạn chế. Từ phần tử Angular - Nếu có sẵn jQuery, thì angle.element là bí danh của hàm jQuery. Nếu jQuery không có sẵn, thì angle.element sẽ ủy quyền cho tập hợp con jQuery có sẵn của Angular, được gọi là "jQuery lite" hoặc "jqLite."
Brian,
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.