AngularJS chuyển dữ liệu đến yêu cầu $ http.get


577

Tôi có một chức năng thực hiện một yêu cầu http POST. Mã được chỉ định dưới đây. Điều này hoạt động tốt.

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

Tôi có một chức năng khác cho http GET và tôi muốn gửi dữ liệu đến yêu cầu đó. Nhưng tôi không có lựa chọn đó trong get.

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

Cú pháp cho http.get

nhận (url, cấu hình)

Câu trả lời:


942

Yêu cầu HTTP GET không thể chứa dữ liệu được đăng lên máy chủ. Tuy nhiên, bạn có thể thêm một chuỗi truy vấn vào yêu cầu.

angular.http cung cấp một tùy chọn cho nó được gọi params.

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

Xem: http://docs.angularjs.org/api/ng.$http#gethttps://docs.angularjs.org/api/ng/service/$http#usage (hiển thị thông số params)


17
điều này sẽ trả lại một lời hứa
Connor Leech

1
Mã với lời hứa: $ http ({phương thức: 'GET', url: '/ someUrl'}). thành công (chức năng (dữ liệu, trạng thái, tiêu đề, cấu hình) {// cuộc gọi lại này sẽ được gọi không đồng bộ // khi có phản hồi}). lỗi (hàm (dữ liệu, trạng thái, tiêu đề, cấu hình) {// được gọi là không đồng bộ nếu xảy ra lỗi // hoặc máy chủ trả về phản hồi với trạng thái lỗi.});
Ehud Grand

130
Angular cũng cung cấp các chức năng trong $http.get(url.details_path, {params: {user_id: user.id}}).
enpenax

15
Sẽ rất tốt nếu giữ khóa đối tượng nhất quán giữa các động từ HTTP ... có dữ liệu cho POST và params cho GET là phản trực giác.
Hubert Perron

7
@HubertPerron Thật ra nó không trực quan vì đây là những thứ khác nhau: DATA có thể đại diện cho một đối tượng / mô hình, thậm chí được lồng và trở thành một phần của tiêu đề POST ... PARAM đại diện cho những gì bạn có thể thêm vào url GET, trong đó mỗi thuộc tính đại diện cho một một phần của chuỗi truy vấn trong url. Thật tốt khi họ có cách đặt tên khác vì nó khiến bạn nhận ra thực tế rằng bạn đang làm điều gì đó khác biệt.
Jos

520

Bạn có thể chuyển params trực tiếp đến $http.get()Sau đây hoạt động tốt

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

2
Điều này hoạt động nhưng đối tượng params đang được chuyển đổi thành String. Làm thế nào để tôi giữ lại đối tượng ban đầu?
wdphd

13
@wdphd Vốn có của HTTP là nó sẽ được mã hóa thành chuỗi truy vấn
Uli Köhler

1
@Uli Köhler: Yup, đã bỏ lỡ điều này. Tôi đã suy nghĩ dọc theo các dòng của bộ định tuyến UI nơi bạn có thể chỉ định loại dữ liệu params. Đã sửa lỗi này với một parseInt đơn giản trên phụ trợ.
wdphd

2
Đây là giải pháp chính xác nếu bạn muốn thêm các tham số GET vào URL đã cho và hoạt động hoàn toàn tốt.
enpenax


43

Bắt đầu từ AngularJS v1.4.8 , bạn có thể sử dụng get(url, config) như sau:

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
Nhưng dữ liệu này vẫn không có trong một cơ thể yêu cầu.
naXa

@naXa GET chỉ nên là thông số url theo quy ước, vì vậy nhiều khung sẽ không cho phép nó thực thi thực tiễn tốt nhất, ngay cả khi về mặt kỹ thuật nó có thể hoạt động và có thể có ý nghĩa.
Barshe Roussy

1
Nếu chỉ có tài liệu AngularJS có thể cung cấp ví dụ đơn giản này!
Norbert Norbertson

@Arpit Aggarwal bạn có tử tế khi xem câu hỏi tương tự của tôi với máy chủ web golang và vue.js không? stackoverflow.com/questions/61520048/
trộm

33

Giải pháp cho những ai quan tâm đến việc gửi thông số và tiêu đề trong yêu cầu 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
});

Ví dụ dịch vụ hoàn chỉnh sẽ như thế này

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

});

Làm thế nào dữ liệu đáp ứng sẽ được sử dụng trong một bộ điều khiển? Cảm ơn.
Floris

3

Bạn thậm chí có thể chỉ cần thêm các tham số vào cuối url:

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

Ghép nối với script.php:

<? var_dump($_GET); ?>

Kết quả trong cảnh báo javascript sau:

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

2
$ http có thoát được không?
Michael Cole

2
Điều này cũng hoạt động nhưng vấn đề với điều này là khi bạn có nhiều tham số sẽ trở nên khó khăn khi thêm chúng vào cuối url cộng với nếu bạn thay đổi một tên biến bạn cũng phải đến và thay đổi nó trong url.
dùng3718908

Tôi biết. Đó là một cuộc biểu tình nhiều hơn, cho thấy rằng bạn thậm chí có thể làm điều đó theo cách thông thường , tôi không nhất thiết phải giới thiệu nó. (Trường hợp 'cách thông thường' có nghĩa là bạn có thể đã làm điều đó trong nhiều năm với php)
Jeffrey Roosendaal

2

Đây là một ví dụ hoàn chỉnh về yêu cầu HTTP GET với các tham số sử dụng angular.js trong ASP.NET MVC:

KIỂM SOÁT:

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

LƯỢT XEM:

<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 Cú pháp với paramsít lỗi hơn so với concat url 'thủ công'
Barshe Roussy

1

Để gửi yêu cầu nhận với tham số tôi sử dụng

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

Bằng cách này, bạn có thể sử dụng chuỗi url của riêng bạn

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.