จาก 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 () เป็นชื่อฟังก์ชันที่ไม่ถูกต้อง?
Bogdan Rybak

พบปัญหาจำลองอื่นstackoverflow.com/questions/11786562/…
Endless

อาจพบวิธีแก้ปัญหาstackoverflow.com/questions/12111936/…ต้องขุดลึก ...
ไม่มีที่สิ้นสุด

คำขอ OPTIONS จะออกโดยเบราว์เซอร์ซึ่งจะโปร่งใสสำหรับ AngularJS / แอปพลิเคชันของคุณ หาก OPTION สำเร็จตามคำขอเดิม (POST / GET / อะไรก็ตาม) จะตามมาและรหัสของคุณจะถูกเรียกกลับสำหรับคำขอหลักไม่ใช่ OPTION หนึ่ง
pkozlowski.opensource

อาจไม่ใช่ Angular ที่เปลี่ยนวิธีการร้องขอเป็น OPTIONS อาจเป็นเพราะเบราว์เซอร์ของคุณกำลังตรวจสอบว่าสามารถทำคำขอ CORS ได้หรือไม่ หากคุณพยายามโทรไปยังโดเมนแยกต่างหากเบราว์เซอร์ของคุณจะทำการร้องขอ OPTIONS ก่อนเพื่อดูว่าได้รับอนุญาตหรือไม่
Ian

คำตอบ:


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 () method)
  • AngularJS จะดูแลการแปลงวัตถุ JS เป็นสตริง JSON และการตั้งค่าส่วนหัว (สามารถปรับแต่งได้)
  • ฟังก์ชันการโทรกลับถูกตั้งชื่อsuccessและerrorตามลำดับ (โปรดสังเกตพารามิเตอร์ของการโทรกลับแต่ละครั้ง) - เลิกใช้ในเชิงมุม v1.5
  • ใช้thenฟังก์ชันแทน
  • สามารถดูข้อมูลthenการใช้งานเพิ่มเติมได้ที่นี่

ข้างต้นเป็นเพียงตัวอย่างสั้น ๆ และคำแนะนำบางประการโปรดตรวจสอบเอกสาร AngularJS สำหรับข้อมูลเพิ่มเติม: http://docs.angularjs.org/api/ng.$http


2
ดีแล้วที่รู้! อย่างไรก็ตามฉันไม่ทราบว่าไคลเอ็นต์เกิดข้อผิดพลาดที่ฉันกำลังจัดการอยู่ Angular เปลี่ยนวิธีการร้องขอเป็น OPTIONS คิดว่าฉันต้องทำบางอย่างในฝั่งเซิร์ฟเวอร์เพื่อรองรับ
สิ้นสุด

ใช่ฉันเดาว่าคุณต้องแยกแยะปัญหาฝั่งเซิร์ฟเวอร์ก่อน จากนั้นคุณจะสามารถเพลิดเพลินกับ $ http เชิงมุมในฝั่งไคลเอ็นต์ได้อย่างเต็มที่ คุณอาจเห็นคำขอ OPTIONS เพิ่มเติมเนื่องจาก AngularJS ส่งส่วนหัวมากขึ้น / แตกต่างกันเมื่อเทียบกับ jQuery
pkozlowski.opensource

1
หมายเหตุ: รับ "params:" แต่ไม่ใช่ "data:" ดูstackoverflow.com/questions/13760070/…
xander27

5
paramsและdataมี 2 ​​สิ่งที่แตกต่างกัน: พารามิเตอร์ลงท้ายด้วย URL (สตริงข้อความค้นหา) ในขณะที่ข้อมูล - ในเนื้อหาคำขอ (สำหรับประเภทคำขอที่สามารถมีเนื้อความได้เท่านั้น)
pkozlowski.opensource

"Angular เปลี่ยนวิธีการร้องขอเป็น OPTIONS คิดว่าฉันต้องทำบางอย่างในฝั่งเซิร์ฟเวอร์เพื่อรองรับ" ฉันมีปัญหาเดียวกัน angular เพิ่มอะไรที่ jquery ไม่ได้?
Andrew Luhring

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 ปัญหาข้ามโดเมน


4
โปรดทราบว่า $ .param คือ jQuery ดังนั้นคุณจะต้องโหลด jQuery เพื่อใช้งาน สำหรับตัวอย่างที่ไม่มี jQuery โดยใช้ $ http transformRequest interceptor โปรดดูpastebin.com/zsn9ASkM
Brian

@ ไบรอันเดี๋ยวก่อน jQuery ไม่ได้ขึ้นอยู่กับ AngularJS? คุณจะไม่มี $ http โดยไม่ต้องโหลด jQuery ก่อน
jnm2

2
@ jnm2 - ไม่ jQuery ไม่ใช่การพึ่งพา AngularJS $ http หมายถึงส่วนประกอบบริการ Angular $ httpไม่ใช่อะไรจาก jQuery AngularJS มี "jQuery Lite" สำหรับจัดการ DOM แต่มีข้อ จำกัด มาก จากองค์ประกอบเชิงมุม - ถ้ามี jQuery angular.element เป็นนามแฝงสำหรับฟังก์ชัน jQuery ถ้า jQuery ไม่พร้อมใช้งาน angular.element จะมอบสิทธิ์ให้กับ jQuery ในตัวของ Angular ซึ่งเรียกว่า "jQuery lite" หรือ "jqLite"
Brian
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.