AngularJS传递数据到$http.get请求

591

我有一个函数,它执行HTTP POST请求。以下是指定的代码。这个很好用。

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

我有另一个用于http GET的函数,我想向该请求发送数据。但是在GET中没有这个选项。

 $http({
   url: user.details_path, 
   method: "GET",
   data: {user_id: user.id}
 });
http.get 的语法为: get(url, config)
7个回答

958

17
这将返回一个承诺。 - Connor Leech
1
带有 Promise 的代码:$http({method: 'GET', url: '/someUrl'}). success(function(data, status, headers, config) { // 当响应可用时,此回调函数将异步调用 }). error(function(data, status, headers, config) { // 如果发生错误或服务器返回错误状态的响应,则异步调用此函数 }); - Ehud Grand
134
Angular也提供了$http.get(url.details_path, {params: {user_id: user.id}})的功能。 - enpenax
16
保持 HTTP 命令中对象键的一致性本来是个不错的想法,因为在 POST 请求中使用数据而在 GET 请求中使用参数是违反直觉的。 - Hubert Perron
8
@HubertPerron 实际上这并不反直觉,因为它们是不同的事情:数据可以表示一个对象/模型,甚至可以嵌套,并成为POST头的一部分...参数代表你可以添加到GET URL中的内容,其中每个属性代表URL中查询字符串的一部分。它们有不同的命名是好的,因为这让你意识到你正在做不同的事情。 - Jos
显示剩余4条评论

529

你可以直接向$http.get()传递参数,下面的代码是可行的。

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

2
这个可以工作,但是 params 对象被转换成了字符串。我该如何保留原始对象? - wdphd
13
HTTP天生就具有将数据编码为查询字符串的特性。 - Uli Köhler
1
@Uli Köhler:是的,我错过了这个。我一直在考虑 UI 路由器,你可以指定参数数据类型。通过后端的简单 parseInt 解决了这个问题。 - wdphd
2
这是正确的解决方案,如果您想要向给定的URL添加GET参数,并且可以完美地工作。 - enpenax
一些同事对URL的长度有所担忧,这真的是一个问题吗? - Juan
1
@Juan,https://dev59.com/XHRC5IYBdhLWcg3wFM_W - Rob

45

AngularJS v1.4.8开始,您可以按以下方式使用get(url, config)

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
但是这些数据仍然不在请求体中。 - naXa stands with Ukraine
1
@naXa GET 应该仅使用 URL 参数,这是一种约定俗成的最佳实践。因此,许多框架将不允许它以强制执行最佳实践,即使在技术上它可以工作并且有意义。 - Christophe Roussy
1
如果 AngularJS 文档能够提供这样简单的示例就好了! - Norbert Norbertson
@Arpit Aggarwal,您能否帮忙看一下我的类似问题,涉及golang web服务器和vue.js的数据交换?链接为https://stackoverflow.com/questions/61520048/how-to-exchange-data-between-go-web-server-and-vue-js-frontend-http-post-404?noredirect=1#comment108824929_61520048。谢谢! - user2315094

34

解决方案:对于那些想要在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
});

一个完整的服务示例看起来像这样:

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

});

响应数据在控制器中如何使用?谢谢。 - Floris

4
您甚至可以将参数简单地添加到URL的结尾:
$http.get('path/to/script.php?param=hello').success(function(data) {
    alert(data);
});

与script.php配对使用:

<? var_dump($_GET); ?>

导致以下javascript警告框的结果:
array(1) {  
    ["param"]=>  
    string(4) "hello"
}

2
$http会进行任何转义吗? - Michael Cole
2
这也可以工作,但问题在于当您有多个参数时,将它们添加到URL的末尾会变得很麻烦,而且如果您更改变量名称,还必须在URL中进行更改。 - user3718908x100
我知道。这更像是一种演示,展示了“甚至可以用常规的方法做到它”,我不一定推荐这样做。(其中“常规的方法”指的是你可能多年来使用 php 做的方式) - Jeffrey Roosendaal

2

以下是使用angular.js在ASP.NET MVC中使用带参数的HTTP GET请求的完整示例:

控制器:

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

查看:

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

在我看来,使用 params 语法比手动拼接 URL 更不容易出错。 - Christophe Roussy

1

发送带参数的GET请求,我使用以下代码:

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

通过这个,你可以使用自己的URL字符串。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接