2013-05-02 19 views
10

tôi có thể thiếu một cái gì đó ở đây nhưng tôi không thể làm cho công việc yêu cầu JSONP này, đây là mã:Angularjs JSONP không làm việc

var url = 'http://' + server + '?callback=JSON_CALLBACK'; 
$http.jsonp(url) 
    .success(function(data){ 
     console.log('success'); 
    }) 
    .error(function() { 
     console.log('error') 
    }); 

Yêu cầu bắn ok và tôi nhận được câu trả lời (với nội dung tiêu đề -Type: application/json) theo định dạng sau:

[{"id": "1", "name": "John Doe"}, 
    {"id": "2", "name": "Lorem ipsum"}, 
    {"id": "3", "name": "Lorem ipsum"}] 

Bạn có thấy gì không? Có lẽ định dạng tôi nên trả về từ máy chủ không đúng? Góc đánh chặn lỗi gọi lại mà không có bất kỳ thông báo lỗi nào ngoài thông báo tôi đã đặt ('lỗi').

+0

Bạn có thể gửi một Plunker? –

+1

phản ứng nào bạn thấy trong fiddler hoặc firebug –

+1

Phản hồi có vẻ không đúng, cần gọi hàm đến hàm gọi lại được chỉ định theo yêu cầu – joakimbl

Trả lời

16

JSONP yêu cầu bạn kết hợp dữ liệu của mình vào cuộc gọi hàm JavaScript. Về mặt kỹ thuật, bạn trả về một tệp JavaScript chứ không phải tệp Json.

Các dữ liệu trả về từ máy chủ nên tương tự như sau:

// the name should match the one you add to the url 
JSON_CALLBACK([ 
    {"id": "1", "name": "John Doe"}, 
    {"id": "2", "name": "Lorem ipsum"}, 
    {"id": "3", "name": "Lorem ipsum"} 
]); 

Sửa: Nếu một số ai khác tình cờ gặp phải vấn đề với JSONP góc của xin vui lòng cũng đọc this answer to this question, nó chứa thông tin hữu ích về cách góc cạnh xử lý thực tế chức năng gọi lại.

+3

Đã giải quyết! Cảm ơn. TheHippo nếu bạn có thể chỉnh sửa câu trả lời của bạn để bao gồm những gì @Gloopy nhận xét: "$ http.jsonp của Angular chuyển đổi tham số truy vấn yêu cầu từ callback = JSON_CALLBACK thành callback = angular.callbacks._0 ", do đó phản hồi không chính xác là JSON_CALLBACK() nhưng angular.callbacks._0 ([ {" id ":" 1 "," name ":" John Doe "}, {" id ":" 2 "," name ":" Lorem ipsum "}]); Nếu có nhiều hơn một yêu cầu, jsonp thứ hai chuyển đổi chuỗi truy vấn yêu cầu gọi lại = JSON_CALLBACK thành angular.callbacks._1 và v.v., vì vậy trong trường hợp của tôi (máy chủ PHP) Tôi đang sử dụng $ _GET ['callback'] để có được tên gọi lại thích hợp – Bema

30

@ TheHippo là chính xác dữ liệu không chỉ là một phản hồi json đơn giản. Here is a working example yêu cầu JSONP đối với điểm cuối youtube trong AngularJS.

Một vài điều cần lưu ý trong ví dụ này:

  • góc của $http.jsonp chuyển đổi các tham số chuỗi truy vấn yêu cầu callback=JSON_CALLBACK-callback=angular.callbacks._0.
  • Khi gọi đến điểm cuối youtube tôi cần xác định cho dịch vụ rằng đây là yêu cầu JSONP bằng cách sử dụng alt=json-in-script thay vì alt=json trong chuỗi truy vấn. Số này được tìm thấy trong số documentation.
  • So sánh kết quả của this url đến this one để xem sự khác biệt giữa phản hồi JSON và JSONP trong trình duyệt của bạn.
  • Hãy xem Chrome Network Panel trong Công cụ dành cho nhà phát triển để giúp so sánh và khắc phục sự cố với yêu cầu/phản hồi của bạn.

Tôi biết ví dụ này rất cụ thể nhưng hy vọng điều đó sẽ hữu ích!

+0

Cảm ơn TheHippo! Ý kiến ​​rất hữu ích – Bema

+0

@Gloopy Cả hai liên kết ở điểm 3 đều giống nhau – GFoley83

+0

@ GFoley83 bắt tốt! Tôi đã cập nhật url thứ hai – Gloopy

-3

Nếu dữ liệu phản hồi là JSON "thuần túy", chúng tôi có thể xử lý nó với $ http.get của góc cạnh.

$http.get(url). 
    then(function(response) { 
    // this callback will be called asynchronously 
    // when the response is available 
    $scope.responseArray = response.data; 
}, function(response) { 
    // called asynchronously if an error occurs 
    // or server returns response with an error status. 
}); 

Tham khảo ví dụ về w3schools

+3

Chỉ khi bạn có CORS thiết lập –

+0

điều này không có gì để làm với jsonp ở tất cả –