javascript - API JSONP non légale-Comment obtenir des données sans le paramètre CALLBACK



angularjs (1)

Angular 1.6 - JSONP lève EXCEPTION malgré la réponse avec le statut: 200 Ok pour l'URL

J'essaie de récupérer des données d'un point de terminaison JSONP. Il semble que les données soient renvoyées dans la réponse, mais Angular génère néanmoins une erreur.

var url = "https://careers.icims.com/jobs-api/"

var trustedUrl = $sce.trustAsResourceUrl(url);

$http.jsonp(trustedUrl, {jsonpCallbackParam: 'jobs'}).then(function(res){

    console.log(res); // this is never executed :.(

});

Je reçois le Uncaught ReferenceError: jobs is not defined at jobs-api?jobs=angular.callbacks._0:1 erreur suivant: Uncaught ReferenceError: jobs is not defined at jobs-api?jobs=angular.callbacks._0:1jobs fait référence à mon préfixe JSONP.

Pourtant, la réponse renvoie le script JSONP:

Pourquoi cette exception est-elle levée et comment peut-elle être supprimée? Je suis sur angulaire 1.6.0


API JSONP non légale

L'API à cette URL n'est pas une API JSONP légale.

Il peut être obtenu avec un service dangereux:

app.service("dangerousAPI", function($q) {
  this.get = get;

  function get(funcName, url) {
    var dataDefer = $q.defer();

    window[funcName] = function(x) {
      dataDefer.resolve(x);
    }

    var tag = document.createElement("script");
    tag.src = url;

    document.getElementsByTagName("head")[0].appendChild(tag);

    return dataDefer.promise;
  }
})

À utiliser à vos risques et périls.

La démo

angular.module("app",[])
.service("dangerousAPI", function($q) {
  this.get = get;
  
  function get(funcName, url) {
    var dataDefer = $q.defer();
  
    window[funcName] = function(x) {
      dataDefer.resolve(x);
    }

    var tag = document.createElement("script");
    tag.src = url;

    document.getElementsByTagName("head")[0].appendChild(tag);
    
    return dataDefer.promise;
  }
})

.run(function($rootScope, dangerousAPI) {
    var url = "https://careers.icims.com/jobs-api/";
    dangerousAPI.get('jobs',url).then(function(data) {
      $rootScope.data = data;
    })
})
<script src="//unpkg.com/angular/angular.js"></script>
  <body ng-app="app">
    <h1>Dangerous API DEMO</h1>
    <pre>{{data | json}}</pre>
  </body>





jsonp