Używam żądania kątowego {X0}}, który z powodzeniem zwrócił JSON zawinięty w funkcję:

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

Jak uzyskać dostęp do / Parse zwrócona funkcja-owinięta-json?

113
akronymn 22 sierpień 2012, 07:36

8 odpowiedzi

Najlepsza odpowiedź

Aktualizacja: Odkąd kątowy 1,6

Nie możesz już korzystać z ciągów JSON_Callback jako symbol zastępczy do określenia, gdzie wartość parametru zwrotna powinna iść

Musisz teraz zdefiniować wywołanie zwrotne jak:

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

Zmień / Dostęp / deklaruj param Via $http.defaults.jsonpCallbackParam, domyślnie do callback

Uwaga: Musisz również upewnić się, że adres URL jest dodawany do zaufanego / białej listy:

$sceDelegateProvider.resourceUrlWhitelist

Lub wyraźnie zaufany przez:

$sce.trustAsResourceUrl(url)

success/error były przestarzałe .

Specjalne metody obietnicy {{X0} success i error zostały przetransportowane i zostaną usunięte w wersji 1.6.0. Zamiast tego użyj standardowej metody. Jeśli $httpProvider.useLegacyPromiseExtensions jest ustawiony na false Następnie te metody rzucą $http/legacy error.

POSŁUGIWAĆ SIĘ:

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

Poprzednia odpowiedź: Kątowy 1.5.x i przed

Wszystko, co powinieneś zrobić, to zmienić callback=jsonp_callback do callback=JSON_CALLBACK jak więc:

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

A potem funkcja .success powinna strzelać jak masz, jeśli powrót zakończył się sukcesem.

Robiąc to w ten sposób utrzymuje się od konieczności zabrudzenia przestrzeni globalnej. Jest to udokumentowane w dokumentacji AngularJS Oto.

Zaktualizowano skrzypce Matt Ball, aby użyć tej metody: http://jsfiddle.net/subhaze/a4rc2/114/ .

Pełny przykład:

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);
    });
301
subhaze 23 grudzień 2017, 23:44

Najważniejsza rzecz Najważniejsza rzecz Nie rozumiałem przez całkiem jakiś czas, jest to, że żądanie musi zawierają "Callback = JSON_Callback", ponieważ AngularJS modyfikuje adres URL żądania >, zastępując unikalny identyfikator dla "json_callback". Odpowiedź serwera musi użyć wartości parametru "Callback" zamiast twardego kodowania "JSON_Callback":

JSON_CALLBACK(json_response);  // wrong!

Odkąd piszę własny skrypt serwera PHP, pomyślałem, że wiedziałem, jaką nazwę funkcji chciał i nie musiała przekazać "Callback = JSON_Callback" na życzenie. Wielki błąd!

AngularJs zastępuje "JSON_Callback" w żądaniu z unikalną nazwą funkcji (jak "Callback = angular.callbacks._0"), a odpowiedź serwera musi zwrócić tę wartość:

angular.callbacks._0(json_response);
69
Joseph Oster 15 październik 2013, 02:11

To było bardzo pomocne. Kątowa nie działa dokładnie jak jQuery. Posiada własną metodę JSONP (), która rzeczywiście wymaga "& callback = json_callback" na końcu ciągu zapytania. Oto przykład:

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

Następnie wyświetlanie lub manipulowanie {{dane}} w szablonie kątowym.

9
Peter 24 grudzień 2014, 02:31

Powinno to działać w porządku dla Ciebie, o ile funkcja jsonp_callback jest widoczna w globalnym zakresie:

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

Pełny demo: http://jsfiddle.net/mattball/a4rc2/ (Zrzeczenie się: Nigdy Napisany dowolny kod AngularJS wcześniej)

4
Matt Ball 22 sierpień 2012, 14:48

Nadal musisz ustawić callback w parametrach:

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

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

Gdzie "FunctionName" jest strunowym odniesieniem do funkcji zdefiniowanej na całym świecie. Możesz zdefiniować go poza skryptem kątowym, a następnie przedefiniować go w module.

4
inorganik 17 styczeń 2017, 17:58

Do parsowania to

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

Lub możesz użyć `$ scopion.data = json.stringify (dane);

W szablonie kątowym można go użyć jako

{{data}}
2
kapil 8 luty 2016, 15:37

Dla mnie powyższe rozwiązania działały tylko raz, gdy dodałem "format = JSONP" do parametrów żądania.

0
Tali 30 czerwiec 2016, 08:04

Używam kątowej 1.6.4 i odpowiedź dostarczana przez subhaze nie działała dla mnie. Zmodyfikowałem go trochę, a następnie działało - musisz użyć wartości zwróconej przez $ SCE.Trustasresourceurl . Pełny kod:

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);
    });
0
mikatuo 11 maj 2017, 06:46