2013-05-15 17 views
6

tôi đang cố gắng để có được một phản ứng JSONP làm việc bằng cách sử dụng đoạn mã sau ...JSON_CALLBACK không tìm thấy sử dụng JSONP

$http.jsonp('http://example.com:8888/?callback=JSON_CALLBACK').success(function(response) 
{ 
    console.dir(response); 
}); 

http://example.com:8888/?callback=JSON_CALLBACK trả về sau qua Node.js

JSON_CALLBACK ({date: '2013-05-15T08: 53: 51.747Z'});

Tiêu đề đang được đặt trong Node.js như thế này ....

res.writeHead(200, {'Content-Type': 'application/json'}); 

Tuy nhiên, lỗi tôi nhận được trong một giao diện điều khiển Chrome này ...

Uncaught ReferenceError: JSON_CALLBACK is not defined 

Tuy nhiên , thật lạ lùng, nếu tôi tạo hàm window.JSON_CALLBACK(response) nó sẽ chạy. Nhưng tôi nghĩ rằng thành công là có nghĩa là để làm điều đó thay cho tôi.

Trả lời

2

Tiêu đề loại nội dung của bạn không chính xác.

Sử dụng application/json nếu những gì bạn trả về là JSON thuần túy. JSONP là Javascript, vì vậy bạn nên sử dụng application/javascript

+0

Cảm ơn bạn đã trả lời nhưng tôi đã thử. Tôi đã gặp lỗi tương tự –

+0

Tôi cũng vậy @tomwrong. Tôi nhận thấy nó đã làm với việc đặt tên của tập tin. Tôi đã thử thay đổi tên của api của tôi (một tệp php) và hoặc thay đổi JSON_CALLBACK thành angular.callbacks._0 trong tệp php. Tôi nghĩ rằng đây là một lỗi của góc cạnh. –

+0

tôi nghĩ rằng nó không phải là một lỗi, tôi nghĩ rằng nó cung cấp nhiều hơn một cuộc gọi lại – blamb

0

tôi thấy hack này và nó làm việc cho tôi

 
    //.........................ini: Hack 
    /* 
     Copy-Paste this code just before your $http request. 
    */  
     var c = $window.angular.callbacks.counter.toString(36); 

     $window['angularcallbacks_' + c] = function (data) { 
      $window.angular.callbacks['_' + c](data); 
      delete $window['angularcallbacks_' + c]; 
     };  
    //.........................end: Hack 

    //Your $http request 
    $http.jsonp(url) 
    .success(function(){ 
     console.log("ok") 
    }) 
    .error(function(data, status, headers, config){ 
     console.error("ko"); 
    }); 
0

Đây là một cách nhanh chóng và giải pháp bẩn. Thay vì xuất ra JSON_CALLBACK({ date:'2013-05-15T08:53:51.747Z' }), bạn có thể thử xuất angular.callbacks._0({ date:'2013-05-15T08:53:51.747Z' }). Tôi tin rằng đây là lỗi trong Angular.

Một cách khác là để yêu cầu url của bạn theo cách này:

$http({ 
    method: 'JSONP', 
    url: 'https://something.com/' + '?callback=JSON_CALLBACK' + '&otherstuffs' 
}); 

PS. Nếu bạn sử dụng php backend, tôi nhận thấy việc thay đổi tên của tập tin php đôi khi sẽ có kết quả tích cực (như thay vì sử dụng index.php chúng ta có thể thử api.php). Mặc dù nó có vẻ là hoàn toàn ngẫu nhiên (những gì tên công trình và ngược lại) - Tôi nghĩ rằng điều này đã làm với cách Angular đọc url của json.

Có vẻ như lý do của lỗi không may này là Angular sẽ thay thế JSON_CALLBACK thành angular.callbacks._0 nhưng đôi khi nó sẽ thất bại do trình thông dịch URL của nó.

Ngoài ra, ngay cả khi máy chủ thành công bạn đang sử dụng có thể không hỗ trợ ?callback=angular.callbacks._0 trong url (đây là hành vi phổ biến giữa các máy chủ).