da jquery $ .ajax a angular $ http


122

Ho questo pezzo di codice jQuery che funziona bene cross origin:

jQuery.ajax({
    url: "http://example.appspot.com/rest/app",
    type: "POST",
    data: JSON.stringify({"foo":"bar"}),
    dataType: "json",
    contentType: "application/json; charset=utf-8",
    success: function (response) {
        console.log("success");
    },
    error: function (response) {
        console.log("failed");
    }
});

Ora sto cercando di convertirlo in codice Angular.js senza alcun successo:

$http({
    url: "http://example.appspot.com/rest/app",
    dataType: "json",
    method: "POST",
    data: JSON.stringify({"foo":"bar"}),
    headers: {
        "Content-Type": "application/json; charset=utf-8"
    }
}).success(function(response){
    $scope.response = response;
}).error(function(error){
    $scope.error = error;
});

Qualsiasi aiuto apprezzato.


3
Non conosci angular.js ma forse faile () è un nome sbagliato di una funzione?
Bogdan Rybak

trovato un altro problema simular stackoverflow.com/questions/11786562/...
Endless

potrebbe aver trovato una soluzione stackoverflow.com/questions/12111936/… bisogno di scavare in profondità ...
Endless

La richiesta di OPZIONI verrà emessa da un browser, sarà trasparente per AngularJS / la tua applicazione. Se l'OPTION ha successo seguirà la richiesta originale (POST / GET / qualunque) e il tuo codice verrà richiamato per la richiesta principale non per quella OPTION.
pkozlowski.opensource

Probabilmente non è Angular che cambia il metodo di richiesta in OPTIONS. Probabilmente è il tuo browser che controlla per vedere se può eseguire una richiesta CORS. Se stai tentando di effettuare una chiamata a un dominio separato, il tuo browser effettuerà prima una richiesta OPTIONS per vedere se è consentito.
Ian

Risposte:


202

Il modo in cui AngularJS chiama $ http sarebbe simile a:

$http({
    url: "http://example.appspot.com/rest/app",
    method: "POST",
    data: {"foo":"bar"}
}).then(function successCallback(response) {
        // this callback will be called asynchronously
        // when the response is available
        $scope.data = response.data;
    }, function errorCallback(response) {
        // called asynchronously if an error occurs
        // or server returns response with an error status.
        $scope.error = response.statusText;
});

o potrebbe essere scritto ancora più semplice utilizzando metodi di scelta rapida:

$http.post("http://example.appspot.com/rest/app", {"foo":"bar"})
.then(successCallback, errorCallback);

Ci sono molte cose da notare:

  • La versione di AngularJS è più concisa (specialmente usando il metodo .post ())
  • AngularJS si occuperà di convertire gli oggetti JS in stringhe JSON e di impostare le intestazioni (quelle sono personalizzabili)
  • Le funzioni di callback sono denominate successeerror rispettivamente (si prega di notare anche i parametri di ogni callback) - Deprecato in angular v1.5
  • usa theninvece la funzione.
  • Maggiori informazioni thensull'utilizzo possono essere trovate qui

Quanto sopra è solo un rapido esempio e alcuni suggerimenti, assicurati di controllare la documentazione di AngularJS per ulteriori informazioni: http://docs.angularjs.org/api/ng.$http


2
Buono a sapersi! tuttavia non penso al suo errore client con cui ho a che fare, Angular cambia il metodo Request in OPTIONS. penso di dover fare alcune cose sul lato server per supportarlo
Endless

Sì, immagino che tu debba prima risolvere i problemi lato server. Quindi sarai in grado di godere della piena potenza di $ http di angular sul lato client. Probabilmente vedi una richiesta OPTIONS aggiuntiva poiché AngularJS sta inviando più / diverse intestazioni rispetto a jQuery.
pkozlowski.opensource

1
NOTA: in GET "params:" ma non "Dati:" vedi stackoverflow.com/questions/13760070/...
xander27

5
paramse datasono 2 cose diverse: i parametri finiscono nell'URL (stringa di query) mentre i dati - nel corpo della richiesta (solo per i tipi di richiesta che effettivamente possono avere corpo).
pkozlowski.opensource

"Angular cambia il metodo Request in OPTIONS. Penso di dover fare alcune cose sul lato server per supportarlo" Ho lo stesso problema, cosa aggiunge Angular che jquery non fa?
Andrew Luhring

1

Possiamo implementare la richiesta ajax utilizzando il servizio http in AngularJs, che aiuta a leggere / caricare i dati dal server remoto.

I metodi di servizio $ http sono elencati di seguito,

 $http.get()
 $http.post()
 $http.delete()
 $http.head()
 $http.jsonp()
 $http.patch()
 $http.put()

Uno degli esempi:

    $http.get("sample.php")
        .success(function(response) {
            $scope.getting = response.data; // response.data is an array
    }).error(){

        // Error callback will trigger
    });

http://www.drtuts.com/ajax-requests-angularjs/



-5

puoi usare $ .param per assegnare i dati:

 $http({
  url: "http://example.appspot.com/rest/app",
  method: "POST",
  data: $.param({"foo":"bar"})
  }).success(function(data, status, headers, config) {
   $scope.data = data;
  }).error(function(data, status, headers, config) {
   $scope.status = status;
 });

guarda questo: AngularJS + ASP.NET Web API Cross-Domain Issue


4
Solo una nota che $ .param è jQuery, quindi avrai bisogno di jQuery caricato per usarlo. Per un esempio senza jQuery utilizzando $ http transformRequest interceptor, vedere pastebin.com/zsn9ASkM
Brian

@Brian Aspetta un minuto, jQuery non è una dipendenza di AngularJS? Non avrai mai $ http senza prima aver caricato jQuery.
jnm2

2
@ jnm2 - no, jQuery non è una dipendenza di AngularJS. $ http si riferisce al componente del servizio $ http angolare , non a nulla da jQuery. AngularJS ha un "jQuery Lite" disponibile per manipolare il DOM, ma è molto limitato. Dall'elemento angolare : se jQuery è disponibile, angular.element è un alias per la funzione jQuery. Se jQuery non è disponibile, angular.element delega al sottoinsieme predefinito di Angular di jQuery, chiamato "jQuery lite" o "jqLite".
Brian
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.