AngularJS passando dados para a solicitação $ http.get

577

Eu tenho uma função que faz uma solicitação HTTP POST. O código é especificado abaixo. Isso funciona bem.

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

Eu tenho outra função para http GET e quero enviar dados para essa solicitação. Mas eu não tenho essa opção no get.

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

A sintaxe para http.geté

get (url, configuração)

Menino gordinho
fonte

Respostas:

942

Uma solicitação HTTP GET não pode conter dados a serem postados no servidor. No entanto, você pode adicionar uma sequência de consultas à solicitação.

angular.http fornece uma opção para isso chamado params.

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

Consulte: http://docs.angularjs.org/api/ng.$http#get e https://docs.angularjs.org/api/ng/service/$http#usage (mostra o paramsparâmetro)

fredrik
fonte
17
isso irá retornar uma promessa
Connor Sanguessuga
1
O código com a promessa: $ http ({method: 'GET', url: '/ someUrl'}). success (function (data, status, headers, config) {// este retorno de chamada será chamado de forma assíncrona // quando a resposta estiver disponível}). error (function (data, status, headers, config) {// chamado de forma assíncrona se ocorrer um erro // ou o servidor retornar uma resposta com um status de erro.});
Ehud Grande
130
Angular também fornece a funcionalidade no $http.get(url.details_path, {params: {user_id: user.id}}).
Enpenax
15
Seria bom manter a chave do objeto consistente entre os verbos HTTP ... ter dados para POST e parâmetros para GET é contra-intuitivo.
precisa
7
@HubertPerron Na verdade, não é contra-intuitivo, pois são coisas diferentes: DATA pode representar um objeto / modelo, até aninhado, e se torna parte do cabeçalho POST ... PARAMS representam o que você pode adicionar ao URL GET, onde cada propriedade representa um parte da string de consulta no URL. É bom que eles tenham nomes diferentes, porque você fica ciente do fato de estar fazendo algo diferente.
Jos
520

Você pode passar parâmetros diretamente para $http.get()as seguintes obras fina

$http.get(user.details_path, {
    params: { user_id: user.id }
});
Roubar
fonte
2
Isso funciona, mas o objeto params está sendo convertido em String. Como reter o objeto original?
Wdphd 02/03
13
@wdphd É inerente ao HTTP que será possível ser codificados para uma seqüência de consulta
Uli Köhler
1
@Uli Köhler: Sim, perdi isso. Eu estava pensando ao longo das linhas do roteador da interface do usuário, onde você pode especificar o tipo de dados params. Corrigido isso com uma análise simples no back-end.
Wdphd 9/03/2015
2
Esta é a solução correta se você deseja adicionar parâmetros GET ao URL fornecido e funciona perfeitamente.
Enpenax
43

A partir do AngularJS v1.4.8 , você pode usar get(url, config) o seguinte:

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
fonte
1
Mas esses dados ainda não estão no corpo de uma solicitação.
NaXa
O @naXa GET deve ser um parâmetro de URL apenas por convenção; muitas estruturas não permitirão aplicar as melhores práticas, mesmo que tecnicamente funcione e faça sentido.
Christophe Roussy
1
Se apenas a documentação do AngularJS pudesse ter fornecido este exemplo simples!
Norbert Norbertson
@Arpit Aggarwal, você gostaria de dar uma olhada na minha pergunta semelhante com o servidor golang e vue.js? stackoverflow.com/questions/61520048/…
user2315094
33

Solução para quem está interessado em enviar parâmetros e cabeçalhos na solicitação 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
});

O exemplo de serviço completo será semelhante a este

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
fonte
Como os dados de resposta seriam usados ​​em um controlador? Obrigado.
Floris
3

Você pode simplesmente adicionar os parâmetros ao final do URL:

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

Emparelhado com script.php:

<? var_dump($_GET); ?>

Resultando no seguinte alerta javascript:

array(1) {  
    ["param"]=>  
    string(4) "hello"
}
Jeffrey Roosendaal
fonte
2
$ http faz algum escape?
Michael Cole
2
Isso também funciona, mas o problema é que, quando você tem vários parâmetros, torna-se difícil adicioná-los ao final do URL, e se você alterar o nome de uma variável, precisará vir e alterá-lo também.
user3718908
Eu sei. Foi mais uma demonstração, mostrando que você pode fazer da maneira regular , eu não recomendo necessariamente. (Onde forma regular 'meios como você já deve ter feito isso há anos com php)
Jeffrey Roosendaal
2

Aqui está um exemplo completo de uma solicitação HTTP GET com parâmetros usando angular.js no ASP.NET MVC:

CONTROLADOR:

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

VISÃO:

<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
fonte
IMHO A sintaxe com paramsé menos suscetível a erros do que uma concat de URL 'manual'
Christophe Roussy
1

Para enviar solicitação get com o parâmetro eu uso

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

Com isso, você pode usar sua própria string de URL

moin khan
fonte