AngularJS che passa i dati alla richiesta $ http.get


577

Ho una funzione che fa una richiesta POST http. Il codice è specificato di seguito. Funziona benissimo.

 $http({
   url: user.update_path, 
   method: "POST",
   data: {user_id: user.id, draft: true}
 });

Ho un'altra funzione per http GET e voglio inviare dati a quella richiesta. Ma non ho questa opzione in get.

 $http({
   url: user.details_path, 
   method: "GET",
   data: {user_id: user.id}
 });

La sintassi di http.getè

get (url, config)

Risposte:


942

Una richiesta HTTP GET non può contenere dati da pubblicare sul server. Tuttavia, è possibile aggiungere una stringa di query alla richiesta.

angular.http fornisce un'opzione per questo chiamato params.

$http({
    url: user.details_path, 
    method: "GET",
    params: {user_id: user.id}
 });

Vedi: http://docs.angularjs.org/api/ng.$http#get e https://docs.angularjs.org/api/ng/service/$http#usage (mostra il paramsparametro)


17
questo restituirà una promessa
Connor Leech,

1
Il codice con la promessa: $ http ({metodo: 'GET', url: '/ someUrl'}). successo (funzione (dati, stato, intestazioni, configurazione) {// questo callback verrà chiamato in modo asincrono // quando la risposta è disponibile}). errore (funzione (dati, stato, intestazioni, configurazione) {// chiamato in modo asincrono se si verifica un errore // o il server restituisce una risposta con uno stato di errore.});
Ehud Grand

130
Angular fornisce anche la funzionalità in $http.get(url.details_path, {params: {user_id: user.id}}).
enpenax,

15
Sarebbe stato bello mantenere la chiave dell'oggetto coerente tra i verbi HTTP ... avere dati per POST e parametri per GET è controintuitivo.
Hubert Perron,

7
@HubertPerron In realtà non è controintuitivo poiché si tratta di cose diverse: DATA può rappresentare un oggetto / modello, anche nidificato, e diventa parte dell'intestazione POST ... I PARAM rappresentano ciò che puoi aggiungere all'URL GET, dove ogni proprietà rappresenta un parte della stringa di query nell'URL. È positivo che abbiano nomi diversi perché ti rende consapevole del fatto che stai facendo qualcosa di diverso.
Jos

520

È possibile passare i parametri direttamente a quanto $http.get()segue funziona correttamente

$http.get(user.details_path, {
    params: { user_id: user.id }
});

2
Funziona ma l'oggetto params viene convertito in String. Come posso conservare l'oggetto originale?
wdphd,

13
@wdphd È inerente a HTTP che verrà codificato in una stringa di query
Uli Köhler

1
@Uli Köhler: Sì, ho perso questo. Stavo pensando lungo le linee del router dell'interfaccia utente in cui è possibile specificare il tipo di dati params. Risolto il problema con una semplice analisi sul back-end.
wdphd,

2
Questa è la soluzione corretta se si desidera aggiungere parametri GET all'URL specificato e funziona perfettamente.
enpenax,


43

A partire da AngularJS v1.4.8 , è possibile utilizzare get(url, config) come segue:

var data = {
 user_id:user.id
};

var config = {
 params: data,
 headers : {'Accept' : 'application/json'}
};

$http.get(user.details_path, config).then(function(response) {
   // process response here..
 }, function(response) {
});

1
Ma questi dati non si trovano ancora in un corpo di richiesta.
naXa,

@naXa GET dovrebbe essere un parametro URL solo per convenzione, quindi molti framework non gli permetteranno di applicare le migliori pratiche, anche se tecnicamente potrebbe funzionare e avere un senso.
Christophe Roussy,

1
Se solo la documentazione di AngularJS avrebbe potuto fornire questo semplice esempio!
Norbert Norbertson,

@Arpit Aggarwal saresti così gentile nel dare un'occhiata alla mia domanda simile con il web server golang e vue.js? stackoverflow.com/questions/61520048/...
user2315094

33

Soluzione per coloro che sono interessati a inviare parametri e intestazioni nella richiesta GET

$http.get('https://www.your-website.com/api/users.json', {
        params:  {page: 1, limit: 100, sort: 'name', direction: 'desc'},
        headers: {'Authorization': 'Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ=='}
    }
)
.then(function(response) {
    // Request completed successfully
}, function(x) {
    // Request error
});

L'esempio di servizio completo sarà simile a questo

var mainApp = angular.module("mainApp", []);

mainApp.service('UserService', function($http, $q){

   this.getUsers = function(page = 1, limit = 100, sort = 'id', direction = 'desc') {

        var dfrd = $q.defer();
        $http.get('https://www.your-website.com/api/users.json', 
            {
                params:{page: page, limit: limit, sort: sort, direction: direction},
                headers: {Authorization: 'Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ=='}
            }
        )
        .then(function(response) {
            if ( response.data.success == true ) { 

            } else {

            }
        }, function(x) {

            dfrd.reject(true);
        });
        return dfrd.promise;
   }

});

Come verrebbero utilizzati i dati di risposta in un controller? Grazie.
Floris,

3

Puoi anche semplicemente aggiungere i parametri alla fine dell'URL:

$http.get('path/to/script.php?param=hello').success(function(data) {
    alert(data);
});

Associato a script.php:

<? var_dump($_GET); ?>

Con conseguente avviso javascript seguente:

array(1) {  
    ["param"]=>  
    string(4) "hello"
}

2
$ http fa qualche escape?
Michael Cole,

2
Anche questo funziona, ma il problema è che quando si hanno più parametri diventa doloroso aggiungerli alla fine dell'url, più se si cambia un nome di variabile, è necessario venire e modificarlo anche nell'url.
user3718908

Lo so. Era più una dimostrazione, dimostrando che puoi anche farlo regolarmente , non lo consiglio necessariamente. (Dove "modo normale" significa come probabilmente lo hai fatto per anni con php)
Jeffrey Roosendaal,

2

Ecco un esempio completo di una richiesta GET HTTP con parametri che utilizzano angular.js in ASP.NET MVC:

CONTROLLER:

public class AngularController : Controller
{
    public JsonResult GetFullName(string name, string surname)
    {
        System.Diagnostics.Debugger.Break();
        return Json(new { fullName = String.Format("{0} {1}",name,surname) }, JsonRequestBehavior.AllowGet);
    }
}

VISUALIZZA:

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js"></script>
<script type="text/javascript">
    var myApp = angular.module("app", []);

    myApp.controller('controller', function ($scope, $http) {

        $scope.GetFullName = function (employee) {

            //The url is as follows - ControllerName/ActionName?name=nameValue&surname=surnameValue

            $http.get("/Angular/GetFullName?name=" + $scope.name + "&surname=" + $scope.surname).
            success(function (data, status, headers, config) {
                alert('Your full name is - ' + data.fullName);
            }).
            error(function (data, status, headers, config) {
                alert("An error occurred during the AJAX request");
            });

        }
    });

</script>

<div ng-app="app" ng-controller="controller">

    <input type="text" ng-model="name" />
    <input type="text" ng-model="surname" />
    <input type="button" ng-click="GetFullName()" value="Get Full Name" />
</div>

IMHO La sintassi con paramsè meno soggetta a errori di un url 'manuale' concat
Christophe Roussy,

1

Per l'invio di ottenere la richiesta con il parametro che uso

  $http.get('urlPartOne\\'+parameter+'\\urlPartTwo')

Con questo puoi usare la tua stringa URL

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.