AngularJS przekazuje dane do żądania $ http.get

577

Mam funkcję, która wykonuje żądanie HTTP POST. Kod jest określony poniżej. To działa dobrze.

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

Mam inną funkcję dla http GET i chcę wysłać dane do tego żądania. Ale nie mam takiej opcji.

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

Składnia dla http.getto

get (url, config)

Pulchny chłopiec
źródło

Odpowiedzi:

942

Żądanie HTTP GET nie może zawierać danych do wysłania na serwer. Możesz jednak dodać ciąg zapytania do żądania.

angular.http zapewnia opcję o nazwie params.

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

Zobacz: http://docs.angularjs.org/api/ng.$http#get i https://docs.angularjs.org/api/ng/service/$http#usage (pokazuje paramsparametry)

Fredrik
źródło
17
to zwróci obietnicę
Connor Leech
1
Kod z obietnicą: $ http ({method: 'GET', url: '/ someUrl'}). sukces (funkcja (dane, status, nagłówki, konfiguracja) {// to wywołanie zwrotne zostanie wywołane asynchronicznie // gdy odpowiedź będzie dostępna}). error (funkcja (dane, status, nagłówki, config) {// wywoływana asynchronicznie, jeśli wystąpi błąd // lub serwer zwraca odpowiedź ze statusem błędu.});
Ehud Grand
130
Angular zapewnia również funkcjonalność w $http.get(url.details_path, {params: {user_id: user.id}}).
enpenax
15
Byłoby miło zachować spójność klucza obiektowego między czasownikami HTTP ... posiadanie danych dla testu POST i parametrów dla GET jest sprzeczne z intuicją.
Hubert Perron,
7
@HubertPerron W rzeczywistości nie jest to sprzeczne z intuicją, ponieważ są to różne rzeczy: DANE mogą reprezentować obiekt / model, nawet zagnieżdżone i stają się częścią nagłówka POST ... PARAMY reprezentują to, co możesz dodać do adresu GET, gdzie każda właściwość reprezentuje część kwerendy w adresie URL. Dobrze, że mają różne nazwy, ponieważ uświadamiają ci, że robisz coś innego.
Jos
520

Państwo może przekazać params bezpośrednio do $http.get()następujących utworów grzywny

$http.get(user.details_path, {
    params: { user_id: user.id }
});
Obrabować
źródło
2
Działa to, ale obiekt params jest konwertowany na String. Jak zachować oryginalny obiekt?
wdphd
13
@wdphd Nieodłącznym elementem HTTP jest to, że będzie zakodowany w ciągu zapytania
Uli Köhler
1
@Uli Köhler: Tak, przegapiłem to. Myślałem w myślach routera interfejsu użytkownika, w którym można określić typ danych parametrów. Naprawiono to za pomocą prostej analizy na zapleczu.
wdphd,
2
To poprawne rozwiązanie, jeśli chcesz dodać parametry GET do podanego adresu URL i działa doskonale.
enpenax
43

Począwszy od AngularJS v1.4.8 , możesz używać get(url, config) w następujący sposób:

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) {
});
Arpit Aggarwal
źródło
1
Ale te dane wciąż nie znajdują się w treści żądania.
naXa
@naXa GET powinna być parametrami url tylko zgodnie z konwencją, więc wiele ram nie pozwoli na egzekwowanie najlepszych praktyk, nawet jeśli technicznie mogłoby to działać i mieć sens.
Christophe Roussy
1
Gdyby tylko dokumentacja AngularJS mogła dostarczyć tego prostego przykładu!
Norbert Norbertson
@Arpit Aggarwal, czy byłbyś tak miły, patrząc na moje podobne pytanie z serwerem WWW golang i vue.js? stackoverflow.com/questions/61520048/…
user2315094
33

Rozwiązanie dla tych, którzy są zainteresowani wysyłaniem params i nagłówków w żądaniu 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
});

Pełny przykład usługi będzie wyglądał następująco

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

});
Subodh Ghulaxe
źródło
W jaki sposób dane odpowiedzi byłyby wykorzystywane w kontrolerze? Dzięki.
Floris,
3

Możesz nawet po prostu dodać parametry na końcu adresu URL:

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

W połączeniu ze skryptem.php:

<? var_dump($_GET); ?>

Powoduje to następujący alert javascript:

array(1) {  
    ["param"]=>  
    string(4) "hello"
}
Jeffrey Roosendaal
źródło
2
czy $ http robi jakieś ucieczki?
Michael Cole
2
To też działa, ale problem polega na tym, że gdy masz wiele parametrów, staje się to bólem, dodając je na końcu adresu URL, a jeśli zmienisz nazwę zmiennej, musisz przyjść i zmienić ją również w adresie URL.
user3718908,
Wiem. To była raczej demonstracja pokazująca, że możesz to zrobić w zwykły sposób , niekoniecznie polecam. (Gdzie „zwykły sposób” oznacza, jak prawdopodobnie robiłeś to przez lata z php)
Jeffrey Roosendaal
2

Oto kompletny przykład żądania HTTP GET z parametrami używającymi angular.js w ASP.NET MVC:

KONTROLER:

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

WIDOK:

<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>
Denys Wessels
źródło
IMHO Składnia z paramsjest mniej podatna na błędy niż „ręczny” konkat URL
Christophe Roussy
1

Do wysłania otrzymaj żądanie z parametrem używam

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

W ten sposób możesz użyć własnego ciągu adresu URL

moin khan
źródło