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


576

我有一个执行http POST请求的函数。该代码在下面指定。这很好。

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

我具有http GET的另一个功能,我想将数据发送到该请求。但是我没有那个选择。

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

的语法http.get

获取(URL,配置)

Answers:


942

HTTP GET请求不能包含要发布到服务器的数据。但是,您可以将查询字符串添加到请求中。

angular.http为此提供了一个选项params

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

请参阅:http : //docs.angularjs.org/api/ng.$http#gethttps://docs.angularjs.org/api/ng/service/$http#usage(显示params参数)


17
这将返回一个承诺
Connor Leech 2014年

1
带有承诺的代码:$ http({method:'GET',url:'/ someUrl'})。success(function(data,status,headers,config){//如果响应可用,此回调将被异步调用//)。错误(功能(数据,状态,标题,配置){//如果发生错误则异步调用// //或服务器返回错误状态的响应。});
2014年

130
Angular还提供的功能$http.get(url.details_path, {params: {user_id: user.id}})
enpenax 2015年

15
保持对象键在HTTP动词之间保持一致是很不错的……POST的数据和GET的参数违反直觉。
休伯特·佩伦

7
@HubertPerron实际上,这不是直觉的,因为这些是不同的东西:DATA可以表示对象/模型,甚至是嵌套的,也可以成为POST标头的一部分... PARAMS表示可以添加到GET url中的内容,每个属性代表一个网址中查询字符串的一部分。最好使用不同的命名,因为这使您意识到您在做不同的事情。
乔斯

520

可以将参数直接传递给$http.get()以下项目

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

2
这有效,但是params对象正在转换为String。我如何保留原始对象?
wdphd

13
@wdphd这是固有的HTTP它无线本地环路进行编码,以查询字符串
乌利柯勒

1
@UliKöhler:是的,错过了。我一直在考虑可以在其中指定params数据类型的UI路由器。在后端使用简单的parseInt修复了此问题。
wdphd 2015年

2
如果要将GET参数添加到给定的URL,并且工作正常,这是正确的解决方案。
enpenax 2015年

1
Rob

43

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

@naXa GET仅应按约定用作url参数,因此,即使从技术上讲它可以工作并且很有意义,许多框架也不允许它强制执行最佳实践。
克里斯托弗·鲁西

1
如果只有AngularJS文档可以提供这个简单的示例!
Norbert Norbertson

@Arpit Aggarwal,请问我对golang Web服务器和vue.js的类似问题是否满意?stackoverflow.com/questions/61520048/...
user2315094

33

对于那些对在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

3

您甚至可以简单地将参数添加到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中进行更改。
user3718908

我知道。它更像是一个演示,表明您甚至可以按常规方式进行操作,我不一定推荐它。(“常规方式”表示您可能已经用php做了多年了)
Jeffrey Roosendaal

2

这是一个在ASP.NET MVC中使用angular.js使用参数的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>

与IMHO语法params比“手动”的URL的concat容易发生误差小
克里斯托夫鲁西

1

为了发送带有参数的get请求,我使用

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

这样,您可以使用自己的网址字符串

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.