аналіз JSONP $ http.jsonp () відповіді в angular.js


112

Я використовую $http.jsonp()запит angular, який успішно повертає json, загорнуту у функцію:

var url = "http://public-api.wordpress.com/rest/v1/sites/wtmpeachtest.wordpress.com/posts?callback=jsonp_callback";

$http.jsonp(url).
    success(function(data, status, headers, config) {
        //what do I do here?
    }).
    error(function(data, status, headers, config) {
        $scope.error = true;
    });

Як отримати доступ / проаналізувати повернуту функцію-JSON?


4
З JSONP ви не "отримуєте доступ / аналізуєте повернуту функцію-JSON". Ваш зворотний дзвінок викликається; він отримує дані JSON як аргумент.
Метт Бал

Я намагався робити щось на кшталт
akronymn

(Вибачте, натисніть, введіть занадто рано вище) У який момент викликається мій зворотній дзвінок? Фрагмент коду був би дуже корисним. Я спробував низку різних речей на даний момент і я здивований.
akronymn

Зворотний виклик викликається, коли відповідь повертається. Чи є у вас функція з ім'ям jsonp_callback? Якщо ні, то є ваша проблема.
Метт Бал

поки що я написав просту функцію, щоб просто повернути перший елемент json, function jsonp_callback(data) { return data.found; //should be 3 }
akronymn

Відповіді:


300

ОНОВЛЕННЯ: з кутового 1.6

Ви більше не можете використовувати рядок JSON_CALLBACK як заповнювач, щоб вказати, куди повинно йти значення параметра зворотного виклику

Тепер ви повинні визначити зворотний виклик так:

$http.jsonp('some/trusted/url', {jsonpCallbackParam: 'callback'})

Змінити / отримати доступ / оголосити параметр через $http.defaults.jsonpCallbackParam, за замовчуванням наcallback

Примітка. Ви також повинні переконатися, що ваша URL-адреса додана до довіреного / білого списку:

$sceDelegateProvider.resourceUrlWhitelist

або явно довіряти через:

$sce.trustAsResourceUrl(url)

success/errorбули застарілими .

Ці $httpметоди обіцяють застарілі successі errorзастаріли і будуть видалені в v1.6.0. Використовуйте замість цього стандартний метод. Якщо $httpProvider.useLegacyPromiseExtensionsвстановлено значення, falseтоді ці методи будуть кинутими $http/legacy error.

ВИКОРИСТАННЯ:

var url = "http://public-api.wordpress.com/rest/v1/sites/wtmpeachtest.wordpress.com/posts"
var trustedUrl = $sce.trustAsResourceUrl(url);

$http.jsonp(trustedUrl, {jsonpCallbackParam: 'callback'})
    .then(function(data){
        console.log(data.found);
    });

Попередня відповідь: Кутовий 1.5.x і раніше

Всі ви повинні зробити , це змінити , callback=jsonp_callbackщоб callback=JSON_CALLBACKвиглядати приблизно так:

var url = "http://public-api.wordpress.com/rest/v1/sites/wtmpeachtest.wordpress.com/posts?callback=JSON_CALLBACK";

І тоді ваша .successфункція повинна спрацьовувати, як у вас, якщо повернення було успішним.

Це робиться таким чином, щоб уникнути забруднення глобального простору. Це зафіксовано в документації AngularJS тут .

Оновлено загадку Метта Балла, щоб використовувати цей метод: http://jsfiddle.net/subhaze/a4Rc2/114/

Повний приклад:

var url = "http://public-api.wordpress.com/rest/v1/sites/wtmpeachtest.wordpress.com/posts?callback=JSON_CALLBACK";

$http.jsonp(url)
    .success(function(data){
        console.log(data.found);
    });

5
моя повертає інший зворотний виклик: angular.callbacks._0 Як мені це виправити?
raberana

@ eaon21 у вас є приклад скрипки?
subhaze

2
@ eaon21 це бажана поведінка, кутовий підміняє JSON_CALLBACK на динамічно генерований, не потрібно на це звертати уваги
Guillaume86

І як ви, наприклад, називаєте Youtube api?
Джино

Схоже, у них є власна клієнтська вкладка для взаємодії з API. Чи є у вас приклади, які можуть допомогти звузити те, що ви намагаєтесь зробити?
subhaze

69

ГОЛОВНЕ я не зрозумів досить довго, що запит повинен містити «зворотний виклик = JSON_CALLBACK», тому що AngularJS модифікує запит URL , підставляючи унікальний ідентифікатор «JSON_CALLBACK». Відповідь сервера повинна використовувати значення параметра "зворотний виклик" замість жорсткого кодування "JSON_CALLBACK":

JSON_CALLBACK(json_response);  // wrong!

Оскільки я писав власний сценарій сервера PHP, я думав, що знаю, яку назву функції вона бажає, і мені не потрібно передавати "callback = JSON_CALLBACK" у запиті. Велика помилка!

AngularJS замінює "JSON_CALLBACK" у запиті унікальною назвою функції (наприклад, "callback = angular.callbacks._0"), і відповідь сервера повинна повернути це значення:

angular.callbacks._0(json_response);

2
Чи є спосіб змінити ім'я зворотного дзвінка так, щоб він працював із жорстко закодованим статичним jsonфайлом.
Павло Ніколов

9

Це було дуже корисно. Кутовий не працює точно так, як JQuery. У нього є власний метод jsonp (), який дійсно вимагає "& callback = JSON_CALLBACK" в кінці рядка запиту. Ось приклад:

var librivoxSearch = angular.module('librivoxSearch', []);
librivoxSearch.controller('librivoxSearchController', function ($scope, $http) {
    $http.jsonp('http://librivox.org/api/feed/audiobooks/author/Melville?format=jsonp&callback=JSON_CALLBACK').success(function (data) {
        $scope.data = data;
    });
});

Потім відображайте або маніпулюйте {{data}} у своєму кутовому шаблоні.


4

Це повинно працювати для вас добре, доки функція jsonp_callbackбуде видимою в глобальному масштабі:

function jsonp_callback(data) {
    // returning from async callbacks is (generally) meaningless
    console.log(data.found);
}

var url = "http://public-api.wordpress.com/rest/v1/sites/wtmpeachtest.wordpress.com/posts?callback=jsonp_callback";

$http.jsonp(url);

Повна демонстрація: http://jsfiddle.net/mattball/a4Rc2/ (відмова від відповідальності: я ніколи раніше не писав жодного коду AngularJS)


Це зробили! Виходить сфера, яку я зіпсував. Дякую!
akronymn

1
Ця відповідь була не дуже корисною. Він не відповідає обсягу AngularJS.
xil3

1
@ xil3 дякую за відгук; на жаль, тільки ОП (акронім) може переключити прийняту відповідь, а не я.
Метт Бал

@DanieleBrugnara, будь ласка, дивіться попередні коментарі до цієї відповіді.
Метт Бал

4

Вам все-таки потрібно встановити callbackпарами:

var params = {
  'a': b,
  'token_auth': TOKEN,
  'callback': 'functionName'
};
$sce.trustAsResourceUrl(url);

$http.jsonp(url, {
  params: params
});

Де 'functionName' - це строго посилання на глобально визначену функцію. Ви можете визначити його поза вашим кутовим сценарієм, а потім переглянути його у своєму модулі.


2

Для розбору зробіть це-

   $http.jsonp(url).
    success(function(data, status, headers, config) {
    //what do I do here?
     $scope.data=data;
}).

Або ви можете використовувати `$ range.data = JSON.Stringify (дані);

У кутовому шаблоні ви можете використовувати його як

{{data}}

0

для мене вищевказані рішення спрацювали лише один раз, коли я додав "format = jsonp" до параметрів запиту.


0

Я використовую кутовий 1.6.4, і відповідь, надана підгалузею , для мене не працювала. Я трохи змінив його, а потім він працював - ви повинні використовувати значення, повернене $ sce.trustAsResourceUrl . Повний код:

var url = "http://public-api.wordpress.com/rest/v1/sites/wtmpeachtest.wordpress.com/posts"
url = $sce.trustAsResourceUrl(url);

$http.jsonp(url, {jsonpCallbackParam: 'callback'})
    .then(function(data){
        console.log(data.found);
    });
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.