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.